- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 Apple 关于与 C API 交互的文档中,它们描述了将标记为 NS_ENUM
的 C 样式枚举导入为 Swift 枚举的方式。这是有道理的,因为 Swift 中的枚举很容易作为 enum
值类型提供,因此很容易看出如何创建我们自己的枚举。
再往下,它是关于 NS_OPTIONS
标记的 C 风格选项的:
Swift also imports options marked with the
NS_OPTIONS
macro. Whereas options behave similarly to imported enumerations, options can also support some bitwise operations, such as&
,|
, and~
. In Objective-C, you represent an empty option set with the constant zero (0
). In Swift, usenil
to represent the absence of any options.
鉴于 Swift 中没有 options
值类型,我们如何创建一个 C 风格的选项变量来使用?
最佳答案
几乎与 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 中,协议(protocol)扩展负责这些的大部分样板文件,它们现在作为符合 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")
}
查看 Swift 导入的 Objective-C 选项(例如 UIViewAutoresizing
),我们可以看到选项被声明为符合协议(protocol)的 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) }
}
现在我们可以像 Apple 文档中描述的那样对待这个新选项集 MyOptions
:您可以使用类似 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")
}
我构建了一个 generator to create a Swift option set没有所有的查找/替换。
最新:对 Swift 1.1 beta 3 的修改。
关于ios - 如何在 Swift 中创建 NS_OPTIONS 风格的位掩码枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833030/
我有一个很大的枚举(为了透明起见,有 63 个值),我现在正在基于该枚举创建一个 NS_Options 位标志。有没有一种方法可以让我编写它以使其灵活? 我对硬编码的主要担忧是: 如果我添加/删除
在 C 的 objective-c 变体中,存在 NS_OPTIONS 以帮助验证位掩码。但它似乎有一个固有的缺陷。如果我需要定义一个表示所有位的按位或的值,例如FubarAllOptions 有些人
我正在尝试实现以下 typedef typedef NS_OPTIONS (NSInteger, MyCellCorners) { MyCellCornerTopLeft, MyCel
这是我想做的。我有一个简单的 NS_OPTIONS 设置,例如 typedef NS_OPTIONS(NSUInteger, BuildingsPresent) { NoBuildings
在下一个案例中我尝试使用 NS_OPTIONS: typedef NS_OPTIONS(NSUInteger, FZAnimalType) { FZAnimalTypeNone = 0,
简短介绍一下我想用它实现的目标: 我有一个自定义的UIView,我想让箭头可见,例如在底部和左侧。我认为可以采用与 UIViewAutoresizing 相同的方式执行此操作。 所以我为我的自定义 V
我在 Xcode5 中使用 clang 预处理了以下代码。 typedef NS_ENUM(NSInteger, MyStyle) { MyStyleDefault, MyStyleC
我在 objc 中定义了以下枚举: typedef NS_OPTIONS(NSInteger, RKRequestMethod) { RKRequestMethodGET =
我在 Objective-C .h 文件中定义了一个 NS_OPTIONS: typedef NS_OPTIONS (NSInteger, Options){ OptionsOne,
在 Apple 关于与 C API 交互的文档中,它们描述了将标记为 NS_ENUM 的 C 样式枚举导入为 Swift 枚举的方式。这是有道理的,因为 Swift 中的枚举很容易作为 enum 值类
上下文 我正在使用 NS_OPTIONS 宏来创建位掩码。我已经为它分配了一种类型的 NSInteger 并且因为我是在 64 位平台上构建的,所以应该给我总共 63 个“槽”来使用(64 位少一位签
在 Objective-C 中创建具有特定类型的枚举的正确方法是什么? NS_ENUM 和 NS_OPTIONS 是如何工作的? NS_OPTIONS 用于 mask ,例如 NSAutoresizi
在 Apple 关于与 C API 交互的文档中,它们描述了将标记为 NS_ENUM 的 C 样式枚举导入为 Swift 枚举的方式。这是有道理的,因为 Swift 中的枚举很容易作为 enum 值类
如何在Objective-C中转发声明NS_OPTIONS? NS_ENUMS 的相关 SO 问题:Forward-declare enum in Objective-C Apple Dev Foru
我必须在我的 Swift 项目中使用 Objective-C 静态库。除了在 Objective-C 头文件中定义的 NS_OPTIONS 枚举外,其他一切正常,如下所示: #import type
我想将 UIRemoteNotificationType 转换为字符串以用于分析跟踪。像“角标(Badge):声音:警报”之类的东西。使用 Xcode 5 中提供的最新 CLANG Objective
Swift 中的 switch 语句更具表现力。我想知道这是否可能: 让我们以 UIViewAutoresizing 为例。它在 Objective-C 中定义如下: typedef NS_OPTIO
我在 Objective C 中声明了枚举 NS_OPTION typedef NS_OPTIONS(NSUInteger, PHRendererType) { PHRendererT
我是一名优秀的程序员,十分优秀!