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]
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END