OptionSet译
一个协译,给bit集合提供了一套数学集合接口。
概况
可以使用选项集合去表示位集合类型,位集合是每一位都表示集合的一个成员。给自定义的类型遵守这个协议,可以让这个类型拥有集合相关的操作,比如:成员测试、组合、还有这些类型的交集。除此之外,当使用特定的标准后,遵守这个协议将不需要额外的工作。
创建一个选项集合,需要在你的类型声名中将包括一个 rawValue属性。为能让类型自动接收集合相关操作的默认实现,这个rawValue属性必须是卷宗FixedWidthInteger协议的类型(如:Int、UInt8)。其次,为了能表示每个raw value的二进制值,需要使用唯一的2的指数做为每个独立属性的raw value值,来在自定义类中创建唯一的静态变量。
比如:有一个叫ShippingOptions的自定义类型,是表示一个顾客乘船可能方式的集合。ShippingOptions包括一个Int类型的rawValue属性,用来存储可用的乘船选项的位遮罩。静态成员有nextDay,secondDay,priority和standard*,都是唯一的、独立的选项。
struct ShippingOptions: OptionSet {
let rawValue: Int
static let nextDay = ShippingOptions(rawValue: 1 << 0)
static let secondDay = ShippingOptions(rawValue: 1 << 1)
static let priority = ShippingOptions(rawValue: 1 << 2)
static let standard = ShippingOptions(rawValue: 1 << 3)
static let express: ShippingOptions = [.nextDay, .secondDay]
static let all: ShippingOptions = [.express, .priority, .standard]
}
可以 声明额外的、使用数组语法包含其它选项值初始化的预配置选项做为静态属性。在例子中,因为express静态类型是一个包含nextDay和secondDay的数组语法生成的,所以它包含有两个元素。
使用集选项合类型
当你需要创建一个选项集合实例时,可以指派静态成员中的一个给你的变量或常量。或者,可以通过包含多个选项集合的数组语法创建有多个成员的选项集合实例。要创建空实例的话,可以分配一个空数组给你的变量。
let singleOption: ShippingOptions = .priority
let multipleOptions: ShippingOptions = [.nextDay, .secondDay, .priority]
let noOptions: ShippingOptions = []
可以使用集合相关的操作去检查成员、加入、或者从一个自定义选项集合类型的实例中移除成员。之后的例子展示了你如何通过顾客的购价决定免费的选项。
let purchasePrice = 87.55
var freeOptions: ShippingOptions = []
if purchasePrice > 50 {
freeOptions.insert(.priority)
}
if freeOptions.contains(.priority) {
print("You've earned free priority shipping!")
} else {
print("Add more to your cart for free priority shipping!")
}
// Prints "You've earned free priority shipping!"
注:希望留下不一样的声音