Swift 3.0
Fast identisch mit Swift 2.0. OptionSetType wurde in OptionSet umbenannt und Aufzählungen werden gemäß Konvention in Kleinbuchstaben geschrieben.
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)
}
Anstatt eine none
Option bereitzustellen, empfiehlt Swift 3, einfach ein leeres Array-Literal zu verwenden:
let noOptions: MyOptions = []
Andere Verwendung:
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")
}
Swift 2.0
In Swift 2.0 kümmern sich Protokollerweiterungen um den größten Teil der Boilerplate für diese, die jetzt als konforme Struktur importiert werden OptionSetType
. ( RawOptionSetType
ist ab Swift 2 Beta 2 verschwunden.) Die Deklaration ist viel einfacher:
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)
}
Jetzt können wir die satzbasierte Semantik verwenden mit 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")
}
Swift 1.2
Mit Blick auf den Objective-C - Optionen , die von Swift importiert wurden ( UIViewAutoresizing
zum Beispiel), können wir sehen , dass die Optionen deklarieren sind als struct
dass Konform Protokoll RawOptionSetType
, was wiederum Konform _RawOptionSetType
, Equatable
, RawRepresentable
, BitwiseOperationsType
, und NilLiteralConvertible
. Wir können unsere eigenen so erstellen:
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) }
}
Jetzt können wir diesen neuen Optionssatz MyOptions
wie in der Apple-Dokumentation beschrieben behandeln: Sie können eine enum
ähnliche Syntax verwenden:
let opt1 = MyOptions.FirstOption
let opt2: MyOptions = .SecondOption
let opt3 = MyOptions(4)
Und es verhält sich auch so, als würden wir erwarten, dass sich Optionen verhalten:
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")
}
Ich habe einen Generator gebaut, um ein Swift-Optionsset ohne das Suchen / Ersetzen zu erstellen .
Neueste: Änderungen für Swift 1.1 Beta 3.
RawOptionsSetType
: nshipster.com/rawoptionsettype