3 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
斯威夫特3.0
與Swift 2.0幾乎相同。OptionSetType重命名為OptionSet,并且按慣例將枚舉寫為小寫。
struct MyOptions : OptionSet {
let rawValue: Int
static let firstOption = MyOptions(rawValue: 1 << 0)
static let secondOption = MyOptions(rawValue: 1 << 1)
static let thirdOption = MyOptions(rawValue: 1 << 2)
}
noneSwift 3建議不要提供選項(xiàng),而只是使用空數(shù)組文字:
let noOptions: MyOptions = []
其他用法:
let singleOption = MyOptions.firstOption
let multipleOptions: MyOptions = [.firstOption, .secondOption]
if multipleOptions.contains(.secondOption) {
print("multipleOptions has SecondOption")
}
let allOptions = MyOptions(rawValue: 7)
if allOptions.contains(.thirdOption) {
print("allOptions has ThirdOption")
}
斯威夫特2.0
在Swift 2.0中,協(xié)議擴(kuò)展會(huì)處理大多數(shù)樣板文件,這些樣板文件現(xiàn)在已作為符合的結(jié)構(gòu)導(dǎo)入OptionSetType。(RawOptionSetType自Swift 2 beta 2起已消失。)聲明要簡(jiǎn)單得多:
struct MyOptions : OptionSetType {
let rawValue: Int
static let None = MyOptions(rawValue: 0)
static let FirstOption = MyOptions(rawValue: 1 << 0)
static let SecondOption = MyOptions(rawValue: 1 << 1)
static let ThirdOption = MyOptions(rawValue: 1 << 2)
}
現(xiàn)在我們可以使用基于集合的語義MyOptions:
let singleOption = MyOptions.FirstOption
let multipleOptions: MyOptions = [.FirstOption, .SecondOption]
if multipleOptions.contains(.SecondOption) {
print("multipleOptions has SecondOption")
}
let allOptions = MyOptions(rawValue: 7)
if allOptions.contains(.ThirdOption) {
print("allOptions has ThirdOption")
}
斯威夫特1.2
看著由夫特導(dǎo)入的(Objective-C的選項(xiàng)UIViewAutoresizing,例如),我們可以看到,選項(xiàng)被聲明為struct符合協(xié)議RawOptionSetType,這反過來又符合 _RawOptionSetType,Equatable,RawRepresentable,BitwiseOperationsType,和NilLiteralConvertible。我們可以這樣創(chuàng)建自己的:
struct MyOptions : RawOptionSetType {
typealias RawValue = UInt
private var value: UInt = 0
init(_ value: UInt) { self.value = value }
init(rawValue value: UInt) { self.value = value }
init(nilLiteral: ()) { self.value = 0 }
static var allZeros: MyOptions { return self(0) }
static func fromMask(raw: UInt) -> MyOptions { return self(raw) }
var rawValue: UInt { return self.value }
static var None: MyOptions { return self(0) }
static var FirstOption: MyOptions { return self(1 << 0) }
static var SecondOption: MyOptions { return self(1 << 1) }
static var ThirdOption: MyOptions { return self(1 << 2) }
}
現(xiàn)在,我們可以像對(duì)待MyOptions蘋果文檔中所述的那樣對(duì)待這個(gè)新的選項(xiàng)集:您可以使用enum-like語法:
let opt1 = MyOptions.FirstOption
let opt2: MyOptions = .SecondOption
let opt3 = MyOptions(4)
而且它的行為也像我們期望的選項(xiàng)那樣:
let singleOption = MyOptions.FirstOption
let multipleOptions: MyOptions = singleOption | .SecondOption
if multipleOptions & .SecondOption != nil { // see note
println("multipleOptions has SecondOption")
}
let allOptions = MyOptions.fromMask(7) // aka .fromMask(0b111)
if allOptions & .ThirdOption != nil {
println("allOptions has ThirdOption")
}
我已經(jīng)構(gòu)建了一個(gè)生成器來創(chuàng)建Swift選項(xiàng)集,而無需進(jìn)行所有查找/替換。
最新:對(duì)Swift 1.1 beta 3的修改。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
Xcode 6.1 Beta 2對(duì)RawOptionSetType協(xié)議進(jìn)行了一些更改(請(qǐng)參閱此Airspeedvelocity博客條目和Apple發(fā)行說明)。
基于Nate Cooks的示例,這里是更新的解決方案。您可以這樣定義自己的選項(xiàng)集:
struct MyOptions : RawOptionSetType, BooleanType {
private var value: UInt
init(_ rawValue: UInt) { self.value = rawValue }
// MARK: _RawOptionSetType
init(rawValue: UInt) { self.value = rawValue }
// MARK: NilLiteralConvertible
init(nilLiteral: ()) { self.value = 0}
// MARK: RawRepresentable
var rawValue: UInt { return self.value }
// MARK: BooleanType
var boolValue: Bool { return self.value != 0 }
// MARK: BitwiseOperationsType
static var allZeros: MyOptions { return self(0) }
// MARK: User defined bit values
static var None: MyOptions { return self(0) }
static var FirstOption: MyOptions { return self(1 << 0) }
static var SecondOption: MyOptions { return self(1 << 1) }
static var ThirdOption: MyOptions { return self(1 << 2) }
static var All: MyOptions { return self(0b111) }
}
然后可以像這樣使用它來定義變量:
let opt1 = MyOptions.FirstOption
let opt2:MyOptions = .SecondOption
let opt3 = MyOptions(4)
像這樣測(cè)試位:
let singleOption = MyOptions.FirstOption
let multipleOptions: MyOptions = singleOption | .SecondOption
if multipleOptions & .SecondOption {
println("multipleOptions has SecondOption")
}
let allOptions = MyOptions.All
if allOptions & .ThirdOption {
println("allOptions has ThirdOption")
}
- 3 回答
- 0 關(guān)注
- 929 瀏覽
添加回答
舉報(bào)