Swift 3.0
เกือบจะเหมือนกับ Swift 2.0 OptionSetType ถูกเปลี่ยนชื่อเป็น OptionSet และ enums เป็นตัวพิมพ์เล็กโดยการประชุม
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
ในสวิฟท์ 2.0 OptionSetType
ส่วนขยายโปรโตคอลดูแลส่วนใหญ่ของสำเร็จรูปสำหรับเหล่านี้ซึ่งจะนำเข้าในขณะนี้เป็นโครงสร้างที่สอดรับไป ( RawOptionSetType
หายไปตั้งแต่ Swift 2 beta 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)
}
ตอนนี้เราสามารถใช้ semantics แบบ set-based กับ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
มองไปที่ตัวเลือก 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: คุณสามารถใช้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 beta 3
RawOptionsSetType
: nshipster.com/rawoptionsettype