Swift 3.0
Presque identique à Swift 2.0. OptionSetType a été renommé OptionSet et les enums sont écrits en minuscules par convention.
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)
}
Au lieu de fournir un none
la recommandation de Swift 3 est d'utiliser simplement un littéral de tableau vide :
let noOptions: MyOptions = []
Autre usage :
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
Dans Swift 2.0, les extensions de protocole prennent en charge la plupart des éléments standard de ces derniers, qui sont désormais importés sous la forme d'une structure conforme aux normes suivantes OptionSetType
. ( RawOptionSetType
a disparu à partir de Swift 2 beta 2). La déclaration est beaucoup plus simple :
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)
}
Maintenant, nous pouvons utiliser la sémantique basée sur les ensembles avec 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
En regardant les options Objective-C qui ont été importées par Swift ( UIViewAutoresizing
par exemple), on peut voir que les options sont déclarées en tant que struct
qui se conforme au protocole RawOptionSetType
qui, à son tour, est conforme à _RawOptionSetType
, Equatable
, RawRepresentable
, BitwiseOperationsType
y NilLiteralConvertible
. Nous pouvons créer le nôtre comme ceci :
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) }
}
Nous pouvons maintenant traiter ce nouvel ensemble d'options, MyOptions
comme décrit dans la documentation d'Apple : vous pouvez utiliser la fonction enum
-comme une syntaxe :
let opt1 = MyOptions.FirstOption
let opt2: MyOptions = .SecondOption
let opt3 = MyOptions(4)
Et il se comporte également comme nous nous attendons à ce que les options se comportent :
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'ai construit un pour créer un jeu d'options Swift sans toutes les recherches/remplacements.
Le plus récent : Modifications pour Swift 1.1 beta 3.
3 votes
Le très célèbre "NSHipster" de @Mattt contient une description détaillée de l'appareil.
RawOptionsSetType
: nshipster.com/rawoptionsettype0 votes
Duplicata possible de Déclarer et utiliser un champ binaire enum en Swift