在 Apple 关于与 C API 交互的文档中,他们描述了将标记NS_ENUM
C 样式枚举导入为 Swift 枚举的方式。这是有道理的,并且由于 Swift 中的枚举很容易作为枚举值类型提供,因此很容易看到如何创建我们自己的枚举
值类型。
再往下看,它是关于NS_OPTIONS
标记的C样式选项的:
Swift还导入标有NS_options
宏的选项。虽然选项的行为类似于导入的枚举,但选项也可以支持一些按位操作,例如
鉴于Swift中没有
选项
值类型,我们如何创建一个C-Style选项变量来使用?
文档中的 Swift 2.0 示例:
struct PackagingOptions : OptionSetType {
let rawValue: Int
init(rawValue: Int) { self.rawValue = rawValue }
static let Box = PackagingOptions(rawValue: 1)
static let Carton = PackagingOptions(rawValue: 2)
static let Bag = PackagingOptions(rawValue: 4)
static let Satchel = PackagingOptions(rawValue: 8)
static let BoxOrBag: PackagingOptions = [Box, Bag]
static let BoxOrCartonOrBag: PackagingOptions = [Box, Carton, Bag]
}
你可以在这里找到它
Xcode 6.1 Beta 2对< code>RawOptionSetType协议进行了一些更改(参见这篇Airspeedvelocity博客条目和Apple发行说明)。
基于Nate Cooks示例,此处是一个更新的解决方案。您可以像这样定义自己的选项集:
struct MyOptions : RawOptionSetType, BooleanType {
private var value: UInt
init(_ rawValue: UInt) { self.value = rawValue }
// MARK: _RawOptionSetType
init(rawValue: UInt) { self.value = rawValue }
// MARK: NilLiteralConvertible
init(nilLiteral: ()) { self.value = 0}
// MARK: RawRepresentable
var rawValue: UInt { return self.value }
// MARK: BooleanType
var boolValue: Bool { return self.value != 0 }
// MARK: BitwiseOperationsType
static var allZeros: MyOptions { return self(0) }
// MARK: User defined bit values
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) }
static var All: MyOptions { return self(0b111) }
}
然后可以像这样使用它来定义变量:
let opt1 = MyOptions.FirstOption
let opt2:MyOptions = .SecondOption
let opt3 = MyOptions(4)
像这样测试比特:
let singleOption = MyOptions.FirstOption
let multipleOptions: MyOptions = singleOption | .SecondOption
if multipleOptions & .SecondOption {
println("multipleOptions has SecondOption")
}
let allOptions = MyOptions.All
if allOptions & .ThirdOption {
println("allOptions has ThirdOption")
}
几乎与 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)
}
Swift 3 建议不要提供 none
选项,而是简单地使用空数组文字:
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)
}
现在,我们可以将基于集合的语义用于< code>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导入的Objective-C选项(例如,UIViewAutoresze
),我们可以看到选项被声明为符合协议RawOptionSetType
的结构
,而该协议又符合_RawOptionSetType
、等价
、RawReposable
、BitwiseoperationsType
和Nil文学转换
。我们可以像这样创建自己的:
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) }
}
现在我们可以像Apple的留档中描述的那样对待这个新的选项集,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的修改。
问题内容: 在Apple有关与C API进行交互的文档中,他们描述了将带有标记的C样式枚举作为Swift枚举导入的方式。这是有道理的,并且由于Swift中的枚举很容易作为值类型提供,因此很容易看到如何创建我们自己的枚举。 再往下,它说了关于标记C样式的选项: Swift还会导入标有宏的选项。而选项的行为类似于进口枚举,选项还可以支持一些位操作,如,和。在Objective- C中,您表示一个空的选
问题内容: 我想做这样的事情: 您可以用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”的重载
此处使用的运算符不能用于所使用的值类型。您要么在这里使用了错误的类型,要么使用了错误的运算符