Skip to content

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