OptionSet
声明
protocol OptionSet : RawRepresentable, SetAlgebra
概述
您使用OptionSet
协议来表示位集类型,其中各个位表示集合的成员。在您的自定义类型中采用此协议可让您对这些类型执行 set-related 操作,例如成员资格测试、联合和交集。更重要的是,当使用特定标准实施时,采用此协议不需要您做额外的工作。
创建选项集时,请在类型声明中包含 rawValue
属性。为了让您的类型自动接收 set-related 操作的默认实现,rawValue
属性必须是符合 FixedWidthInteger
协议的类型,例如 Int
或 UInt8
。接下来,使用每个属性的原始值的唯一幂(1、2、4、8、16 等)创建唯一选项作为自定义类型的静态属性,以便每个属性可以由单个位表示类型的原始值。
例如,考虑一个名为 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 = []
使用set-related 操作来检查成员资格并在自定义选项集类型的实例中添加或删除成员。以下示例显示了如何根据客户的购买价格确定免费送货选项:
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!"
可用版本
相关用法
- Swift OptionSet init(rawValue:)用法及代码示例
- Swift Optional.Publisher reduce(_:_:)用法及代码示例
- Swift Optional.Publisher tryDrop(while:)用法及代码示例
- Swift Optional symbolVariant(_:)用法及代码示例
- Swift Optional popover(isPresented:attachmentAnchor:arrowEdge:content:)用法及代码示例
- Swift Optional.Publisher debounce(for:scheduler:options:)用法及代码示例
- Swift Optional.Publisher breakpoint(receiveSubscription:receiveOutput:receiveCompletion:)用法及代码示例
- Swift Optional mask(alignment:_:)用法及代码示例
- Swift Optional.Publisher mapError(_:)用法及代码示例
- Swift Optional listSectionSeparatorTint(_:edges:)用法及代码示例
- Swift Optional badge(_:)用法及代码示例
- Swift Optional.Publisher catch(_:)用法及代码示例
- Swift Optional.Publisher tryAllSatisfy(_:)用法及代码示例
- Swift Optional.Publisher zip(_:_:_:)用法及代码示例
- Swift Optional fullScreenCover(isPresented:onDismiss:content:)用法及代码示例
- Swift Optional.Publisher sink(receiveValue:)用法及代码示例
- Swift Optional keyboardType(_:)用法及代码示例
- Swift Optional clipShape(_:style:)用法及代码示例
- Swift Optional.Publisher scan(_:_:)用法及代码示例
- Swift Optional.Publisher throttle(for:scheduler:latest:)用法及代码示例
- Swift Optional preferredColorScheme(_:)用法及代码示例
- Swift Optional.Publisher assertNoFailure(_:file:line:)用法及代码示例
- Swift Optional background(_:ignoresSafeAreaEdges:)用法及代码示例
- Swift Optional saturation(_:)用法及代码示例
- Swift Optional focusSection()用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 OptionSet。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。