स्विफ्ट 3.0
लगभग स्विफ्ट 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
विकल्प प्रदान करने के बजाय , स्विफ्ट 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")
}
स्विफ्ट 2.0
स्विफ्ट 2.0 में, प्रोटोकॉल एक्सटेंशन इन के लिए अधिकांश बॉयलरप्लेट का ख्याल रखते हैं, जो अब एक ऐसी संरचना के रूप में आयात किया जाता है जो इसके अनुरूप होता है OptionSetType
। ( RawOptionSetType
स्विफ्ट 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")
}
स्विफ्ट 1.2
ऑब्जेक्टिव-सी विकल्पों (स्विफ्ट द्वारा आयात किया गया को देखते हुए 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")
}
मैंने सभी खोज / प्रतिस्थापन के बिना एक स्विफ्ट विकल्प सेट बनाने के लिए एक जनरेटर का निर्माण किया है ।
नवीनतम: स्विफ्ट 1.1 बीटा 3 के लिए संशोधन।
RawOptionsSetType
: nshipster.com/rawoptionsettype