Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Sometimes there are situations where you want to use an Enum in an OptionSet or you want Enum backed by a RawType of Int but also have String labels as well

License

Notifications You must be signed in to change notification settings

brightdigit/Options

Repository files navigation

Options

Options

More powerful options for Enum and OptionSet types.

SwiftPM Twitter GitHub GitHub issues GitHub Workflow Status

Codecov CodeFactor Grade codebeat badge Code Climate maintainability Code Climate technical debt Code Climate issues Reviewed by Hound

Table of Contents

Introduction

Options provides a powerful set of features for Enum and OptionSet types:

  • Providing additional representations for Enum types besides the RawType rawValue
  • Being able to interchange between Enum and OptionSet types
  • Using an additional value type for a Codable OptionSet

Requirements

Apple Platforms

  • Xcode 14.1 or later
  • Swift 5.7.1 or later
  • iOS 16 / watchOS 9 / tvOS 16 / macOS 12 or later deployment targets

Linux

  • Ubuntu 20.04 or later
  • Swift 5.7.1 or later

Installation

Use the Swift Package Manager to install this library via the repository url:

https://github.com/brightdigit/Options.git

Use version up to 1.0.

Usage

Versatile Options

Let's say we are using an Enum for a list of popular social media networks:

enum SocialNetwork : Int {
 case digg
 case aim
 case bebo
 case delicious
 case eworld
 case googleplus
 case itunesping
 case jaiku
 case miiverse
 case musically
 case orkut
 case posterous
 case stumbleupon
 case windowslive
 case yahoo
}

We'll be using this as a way to define a particular social handle:

struct SocialHandle {
 let name : String
 let network : SocialNetwork
}

However we also want to provide a way to have a unique set of social networks available:

struct SocialNetworkSet : Int, OptionSet {
...
}
let user : User
let networks : SocialNetworkSet = user.availableNetworks()

We can then simply use Options() macro to generate both these types:

@Options
enum SocialNetwork : Int {
 case digg
 case aim
 case bebo
 case delicious
 case eworld
 case googleplus
 case itunesping
 case jaiku
 case miiverse
 case musically
 case orkut
 case posterous
 case stumbleupon
 case windowslive
 case yahoo
}

Now we can use the newly create SocialNetworkSet type to store a set of values:

let networks : SocialNetworkSet
networks = [.aim, .delicious, .googleplus, .windowslive]

Multiple Value Types

With the Options() macro, we add the ability to encode and decode values not only from their raw value but also from a another type such as a string. This is useful for when you want to store the values in JSON format.

For instance, with a type like SocialNetwork we need need to store the value as an Integer:

5

However by adding the Options() macro we can also decode from a String:

"googleplus"

Creating an OptionSet

We can also have a new OptionSet type created. Options() create a new OptionSet type with the suffix -Set. This new OptionSet will automatically work with your enum to create a distinct set of values. Additionally it will decode and encode your values as an Array of String. This means the value:

[.aim, .delicious, .googleplus, .windowslive]

is encoded as:

["aim", "delicious", "googleplus", "windowslive"]

Further Code Documentation

Documentation Here

License

This code is distributed under the MIT license. See the LICENSE file for more info.

About

Sometimes there are situations where you want to use an Enum in an OptionSet or you want Enum backed by a RawType of Int but also have String labels as well

Topics

Resources

License

Stars

Watchers

Forks

Packages

AltStyle によって変換されたページ (->オリジナル) /