swift - Swift 中导入 NS_OPTIONS (RawOptionSetType) 的 Switch 语句?

标签 swift switch-statement enumeration

Swift 中的 switch 语句更具表现力。我想知道这是否可能:

让我们看看 UIViewAutoresizing 的例子。它在 Objective-C 中的定义如下:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

我可以像枚举一样在 Swift 中使用它:

let foo = UIViewAutoresizing([.FlexibleHeight, .FlexibleTopMargin])

是否可以使用 switch 语句代替多个 if 语句?

if foo & UIViewAutoresizing.FlexibleHeight != nil {

}

if foo & UIViewAutoresizing.FlexibleWidth != nil {

}

if foo & UIViewAutoresizing.FlexibleTopMargin != nil {

}

像这样的伪代码:

switch foo { // ** THIS IS PSEUDO CODE AND WILL NOT COMPILE **

case & .FlexibleHeight:
    println("height")

case & .FlexibleWidth:
    println("width")

case & .FlexibleTop:
    println("top")

}

最佳答案

我对这个问题感到非常沮丧,所以我写了一个 Bitmask<T>可以处理这些用例的类。代码在Github上:brynbellomy/SwiftBitmask

它允许您使用任何类型的对象作为基础类型来执行类似的操作(这里我使用 enum ):

enum MonsterAttributes : IBitmaskRepresentable, IAutoBitmaskable {
    case Big, Ugly, Scary

    static var autoBitmaskValues : [MonsterAttributes] = [.Big, .Ugly, .Scary,]
    var  bitmaskValue: UInt16  { return AutoBitmask..autoBitmaskValueFor(self) }
    init(bitmaskValue: UInt16) { self = AutoBitmask.autoValueFromBitmask(bitmaskValue) }
}

// various ways to initialize
let option : MonsterAttributes = .Ugly

let bitmaskOfOption        = Bitmask(option)
let anotherBitmaskOfOption = |MonsterAttributes.Ugly // same as bitmaskOfOption

let orWithVar = option | .Big                 // == Bitmask<MonsterAttributes> with a bitmaskValue of 1 | 2
let simpleOr  = MonsterAttributes.Big | .Ugly // == Bitmask<MonsterAttributes> with a bitmaskValue of 1 | 2

// getting the raw integral bitmask value
let simpleOrValue = simpleOr.bitmaskValue                        // == UInt16(1 | 2)
let orValue       = (MonsterAttributes.Big | .Ugly).bitmaskValue // == UInt16(1 | 2)

// implements BooleanType
if simpleOr & .Ugly             { /* this code will execute */ }

// supports pattern matching operator
if simpleOr ~= .Ugly            { /* this code will execute */ }
if simpleOr ~= (.Ugly | .Scary) { /* this code will execute */ }

...您所要做的就是实现一个单一属性协议(protocol)。

我真的很好奇是否有人对代码有任何反馈或想法,所以如果您有任何想法,请在队列中留下问题!

关于swift - Swift 中导入 NS_OPTIONS (RawOptionSetType) 的 Switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25388065/

相关文章:

c - c 中的枚举?它们可以用于存储吗

javascript - 从 'namespace' 字符串构建对象层次结构

ios - 如何在我们的 iOS 应用程序中添加一个 "chromecast connection success"回调方法

c++ - 在 switch-case 中打开 else 分支可以吗?

ios - 无法将自定义类数组保存到 UserDefaults

gcc - 您可以将 builtin_expect 与 switch 语句一起使用吗

objective-c - While 循环与 Objective-C 中的嵌套开关

ruby - 为什么 3.times 需要一个 .each 如果作为参数传递,而不是直接使用,如 "3.times do xyz end"

ios - 通过 segue 将 CKAsset 图像传递给 ViewController?

ios - 在 xcode ui test 中运行所有测试类