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]