【问题标题】:How to determine if undocumented value for NS_ENUM with Swift 1.2如何使用 Swift 1.2 确定 NS_ENUM 的未记录值
【发布时间】:2015-04-10 20:28:50
【问题描述】:

例如,定义了以下 NS_Enum...

typedef NS_ENUM(NSInteger, Type) {
  TypeNone = 0,
  TypeA = 1,
}
var x = 2
if let type: Type = Type(rawValue: x) {
  // Swift 1.2 executes this block.
}
else {
  // Previous swift executes this block.
}

如何确定 x 是否在 NS_ENUM 上定义?

【问题讨论】:

    标签: objective-c swift enums


    【解决方案1】:

    假设这是 Swift 1.2 中以下更改的结果,记录在 Xcode 6.3 release notes:

    具有未记录值的导入 NS_ENUM 类型,例如 UIViewAnimationCurve,现在可以从它们的原始整数转换 使用 init(rawValue:) 初始化器的值而不被重置为 nil。使用unsafeBitCast 作为此问题的解决方法的代码可以 被写入使用原始值初始化器。例如:

    let animationCurve =  
         unsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue,
         UIViewAnimationCurve.self)
    

    现在可以改为:

    let animationCurve = UIViewAnimationCurve(rawValue:  
        userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!
    

    问题(如果我理解正确的话)是

    typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { ... }
    

    只定义了 4 个可能的枚举值,但实际上可以取其他 (未记录的)值也是如此。这使得一些讨厌的变通方法变得必要,例如

    为了解决这个问题,Swift 1.2 现在允许创建 具有任意原始值的枚举变量(底层的 整数类型),如果枚举是从NS_ENUM 导入的 定义。

    因此,不可能以编程方式检查是否 “原始值”是 NS_ENUM 定义中定义的值之一。

    【讨论】:

    • 更多惊人的 Swift 语法问题。越来越多的理由喜欢它而不是 ObjC/C。
    【解决方案2】:

    试试这个:

    typedef NS_ENUM(NSInteger, Type) {
        TypeZero = 0,
        TypeOne = 1,
        TypeTwo = 2,
        TypeUnexpected = INT_MAX
    };
    
    switch Type(rawValue: 3) ?? .unexpected {
    case .zero:
        // Handle type zero
        ...
    case .one:
        // Handle type one
        ...
    case .two:
        // Handle type two
        ...
    default:
        // Handle unexpected types
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2020-08-24
      相关资源
      最近更新 更多