Options
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
Install / Use
/learn @brightdigit/OptionsREADME
More powerful options for Enum and OptionSet types.
Table of Contents
Introduction
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
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
License
This code is distributed under the MIT license. See the LICENSE file for more info.
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
