Swift 中的 OptionSet 允许你定义一组关于装备的选项,每个选项只会占用一个比特位。从效果上来看,它等同于 Objective-C 中的 NS_OPTIONS。

从形式上来看,OptionSet 跟枚举很相似。但它们运用场景是不同的。

关于枚举,一般我们只会运用其单一的某个值。比方下面的关于等级的枚举:

enum Level {
    case high
    case medium
    case low
}

当我们运用的时分,一般只会用到某一个 case,不会存在某个条件既 high 又 low 的状况。

而关于 OptionSet ,一般都是运用多个值来进行装备的。比方 WritingOptions 的运用:

data = try JSONSerialization.data(withJSONObject: messageWrapper, options: [.prettyPrinted, .sortedKeys])

OptionSet 是什么

OptionSet 是 Swift 规范库的一个协议。它代表的是比特集的类型,每一位比特代表了一个选项。

假如自定义类型恪守了该协议,则该类型可以执行与调集相关的操作,比方网络装备项、本地缓存装备项等等。更重要的是,当运用特定规范实现时,恪守该协议并不需要你写额定的代码。

怎么运用

当创立选项集的时分,首要,自定义类型有必要包括一个名字为 rawValue 的特点,且该类型有必要恪守了 FixedWidthInteger 协议,比方 Int 或者 UInt8 。

然后,再去创立静态特点的每个装备项,且每个装备项需仅有。每个装备项的原始值依次为 1/2/4/16等等。

原始值解说:

  • 1 << 0 代表不移动,2 的零次方为 1
  • 1 << 1 代表挪动一位,2 的 1 次方为 2
  • 以此类推

下面是一个缓存库的装备项示例代码:

struct CacheOptions: OptionSet {
    let rawValue: Int
    static let memory = CacheOptions(rawValue: 1 << 0)
    static let disk = CacheOptions(rawValue: 1 << 1)
    static let autoClear = CacheOptions(rawValue: 1 << 2)
}

下面是运用的三种方法:

  • 赋值空选项:let noOptions: CacheOptions = []
  • 赋值单个选项:let singleOption: CacheOptions = .memory
  • 赋值多个选项:let multipleOptions: CacheOptions = [.memory, .autoClear]