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
Options provides a powerful set of features for Enum and OptionSet types:
- Providing additional representations for
Enumtypes besides theRawType rawValue - Being able to interchange between
EnumandOptionSettypes - Using an additional value type for a
CodableOptionSet
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
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.
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]
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:
5However by adding the Options() macro we can also decode from a String:
"googleplus"
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"]
This code is distributed under the MIT license. See the LICENSE file for more info.