Swift 3.0
Gần giống với Swift 2.0. OptionSetType đã được đổi tên thành Tùy chọn và enums được viết bằng chữ thường theo quy ước.
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)
}
Thay vì cung cấp một none
tùy chọn, khuyến nghị của Swift 3 chỉ đơn giản là sử dụng một mảng trống theo nghĩa đen:
let noOptions: MyOptions = []
Cách sử dụng khác:
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
Trong Swift 2.0, các phần mở rộng giao thức đảm nhiệm hầu hết các mẫu soạn sẵn cho các phần mở rộng này, hiện được nhập dưới dạng cấu trúc phù hợp với OptionSetType
. ( RawOptionSetType
đã biến mất kể từ Swift 2 beta 2.) Việc khai báo đơn giản hơn nhiều:
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)
}
Bây giờ chúng ta có thể sử dụng ngữ nghĩa dựa trên tập hợp với 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
Nhìn vào các tùy chọn Objective-C được nhập khẩu bởi Swift ( UIViewAutoresizing
chẳng hạn), chúng ta có thể thấy rằng tùy chọn được khai báo là một struct
mà phù hợp với giao thức RawOptionSetType
, mà trong chiếu theo lần lượt _RawOptionSetType
, Equatable
, RawRepresentable
, BitwiseOperationsType
, và NilLiteralConvertible
. Chúng ta có thể tạo riêng của chúng tôi như thế này:
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) }
}
Bây giờ chúng tôi có thể xử lý bộ tùy chọn mới này MyOptions
, giống như được mô tả trong tài liệu của Apple: bạn có thể sử dụng enum
cú pháp giống như:
let opt1 = MyOptions.FirstOption
let opt2: MyOptions = .SecondOption
let opt3 = MyOptions(4)
Và nó cũng hoạt động như chúng ta mong đợi các tùy chọn để hành xử:
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")
}
Tôi đã xây dựng một trình tạo để tạo một tùy chọn Swift mà không cần tìm / thay thế.
Mới nhất: Sửa đổi cho Swift 1.1 beta 3.
RawOptionsSetType
: nshipster.com/rawoptionsettype