Swift 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)
}
none
オプションを提供する代わりに、Swift 3の推奨は単に空の配列リテラルを使用することです:
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")
}
Swift 2.0
Swift 2.0では、プロトコル拡張機能がこれらのボイラープレートのほとんどを処理しOptionSetType
ます。これらは現在、に準拠する構造体としてインポートされています。(RawOptionSetType
Swift 2ベータ2で廃止されました。)宣言ははるかに簡単です:
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)
}
これで、セットベースのセマンティクスを使用できます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
(スウィフトが輸入したObjective-Cのオプションを見てみるとUIViewAutoresizing
、例えば)、我々はオプションは次のように宣言されていることがわかりますstruct
プロトコルに準拠していることをRawOptionSetType
、順番に準拠する _RawOptionSetType
、Equatable
、RawRepresentable
、BitwiseOperationsType
、とNilLiteralConvertible
。次のようにして独自のものを作成できます。
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) }
}
これMyOptions
で、Appleのドキュメントで説明されているのと同じように、この新しいオプションセットを処理できます。- like enum
構文を使用できます。
let opt1 = MyOptions.FirstOption
let opt2: MyOptions = .SecondOption
let opt3 = MyOptions(4)
また、オプションが動作することを期待するように動作します。
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")
}
すべての検索/置換を行わずにSwiftオプションセットを作成するジェネレーターを作成しました。
最新: Swift 1.1ベータ3の変更。
RawOptionsSetType
/ rawoptionsettype