在Apple有关与C
API进行交互的文档中,他们描述了将NS_ENUM
带有标记的C样式枚举作为Swift枚举导入的方式。这是有道理的,并且由于Swift中的枚举很容易作为enum
值类型提供,因此很容易看到如何创建我们自己的枚举。
再往下,它说了关于NS_OPTIONS
标记C样式的选项:
Swift还会导入标有
NS_OPTIONS
宏的选项。而选项的行为类似于进口枚举,选项还可以支持一些位操作,如&
,|
和~
。在Objective-
C中,您表示一个空的选项集,其常数为零(0
)。在Swift中,用于nil
表示没有任何选项。
鉴于options
Swift中没有值类型,我们如何创建要使用的C-Style选项变量?
几乎与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中,协议扩展会处理大多数样板文件,这些样板文件现在已作为符合的结构导入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)
}
现在我们可以使用基于集合的语义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")
}
看着由夫特导入的(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
苹果文档中所述的那样对待这个新的选项集:您可以使用enum
-like语法:
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的修改。
问题内容: 我想做这样的事情: 您可以用Java这样做吗?(我来自ac#背景) 问题答案: 您可以轻松地使用
问题内容: 我要做什么才能完成此任务?另外,可以说我将其更改为: 我该如何使它符合Decodable? EDit 这是我的完整代码(不起作用) 最终编辑 另外,它将如何处理这样的枚举? 问题答案: 这很简单,只需使用或隐式分配的原始值即可。 被编码到并到 要么 被编码到并到 这是一个简单的示例如何使用它:
问题内容: 我正在制作绘图应用程序,我想通过枚举引用我的颜色。例如,每次我想要红色时,使用它会更干净,更方便,而不用键入值。但是,Swift的原始值枚举似乎并不接受UIColor作为类型。有没有办法用枚举或类似方法做到这一点? 问题答案: 我这样做(基本上使用结构作为名称空间): 您可以像这样使用它: 因此,您可以在自定义主题中使用红色。
问题内容: 我一直在四处搜寻有关如何使用Swift 2.0为MapView制作MKCircle注释的良好解释,但我似乎找不到足够的解释。有人可以张贴一些示例代码来显示如何创建MKCircle批注吗?这是我用来制作地图并获取坐标的代码。 问题答案: 将展示有关如何使用xcode 8.3.3的swift 3在地图视图上创建圆形叠加层的分步方法 在您的主故事板文件中,将地图工具包视图拖到故事板的场景(视
问题内容: 我一直在努力在Swift中创建UIAlertView,但由于某种原因,由于出现此错误,我无法正确执行该语句: 找不到接受提供的参数的’init’的重载 这是我的写法: 然后调用它,我正在使用: 截至目前,它崩溃了,我似乎无法正确理解语法。 问题答案: 从班级: //不推荐使用UIAlertView。改用 UIAlertController 和UIAlertControllerStyle
我一直在Swift中创建一个UIAlertView,但由于某种原因,我无法得到正确的语句,因为我得到了以下错误: 找不到接受所提供参数的“init”的重载