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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。