在Swift中实现ObjC中的NS_OPTION不是通过enum,而是通过conform RawOptionSetType protocol的struct来实现的。
代码如下:
struct Test : 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: Test { return self(0) } static func fromMask(raw: UInt) -> Test { return self(raw) } var rawValue: UInt { return self.value } static var None: Test { return self(0) } static var T1: Test { return Test(1 << 0) } static var T2: Test { return Test(1 << 1) } }
查看 RawOptionSetType 会发现还有equable 和 BitwiseOperationsType没有实现。这其实是Swift标准库通过泛型实现的可以参考NShipster上的这篇文章
虽然Apple用泛型全局函数实现这些协议中的方法减少了不少样板代码(boilerplate),但是这个struct还是有不少boilerplate。此处有一个swift option 生成器