【问题标题】:How do I compare an NSNumber to a swift enumeration value?如何将 NSNumber 与快速枚举值进行比较?
【发布时间】:2014-09-13 19:04:44
【问题描述】:

我正在尝试对通过 NSNotification 接收的值和枚举值进行简单比较。我有一些有用的东西,但我不敢相信这是做这件事的正确方法。基本上我最终得到的解决方案是将 NSNumber 转换为 Int,并获取枚举值的 rawValue,将其包装在 NSNumber 中,然后获取它的 integerValue。

我尝试的所有其他方法都导致编译器错误,无法在 Uint 8 和 Int 或类似的东西之间进行转换。

    observer = NSNotificationCenter.defaultCenter().addObserverForName(AVAudioSessionRouteChangeNotification, object: nil, queue: mainQueue) { notification in

        println(AVAudioSessionRouteChangeReason.NewDeviceAvailable.toRaw())

        if let reason = notification.userInfo[AVAudioSessionRouteChangeReasonKey!] as? NSNumber  {
            if (reason.integerValue == NSNumber(unsignedLong:AVAudioSessionRouteChangeReason.NewDeviceAvailable.toRaw()).integerValue) {
                self.headphoneJackedIn = true;
            } else if (reason.integerValue == NSNumber(unsignedLong:AVAudioSessionRouteChangeReason.OldDeviceUnavailable.toRaw()).integerValue) {
                self.headphoneJackedIn = false;
            }
            self.updateHeadphoneJackLabel()
        }
    }

【问题讨论】:

  • 改用fromRaw怎么样?

标签: cocoa swift


【解决方案1】:

这应该可行:

if reason.integerValue == Int(AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue) {
    // ...
}

备注: AVAudioSessionRouteChangeReason 枚举使用 UInt 作为原始值类型,所以 可以预期这无需显式转换即可工作:

if reason.unsignedIntegerValue == AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue {

}

但是,从 Xcode 6 beta 4 开始,NSUInteger 在 OS X 和 iOS 中映射到 Swift 的 Int 系统框架,这意味着integerValueunsignedIntegerValue 都返回Int, 并且在任何情况下都需要显式转换。

或者,您可以从数字创建一个枚举值(正如@ColinE 已经建议的那样 在评论中),然后使用 switch case:

if let r = AVAudioSessionRouteChangeReason(rawValue: UInt(reason.integerValue)) {
    switch r {
    case .NewDeviceAvailable:
        // ...
    case .OldDeviceUnavailable:
        // ...
    default:
        // ...
    }
} else {
    println ("Other reason")
}

出于与上述相同的原因,此处也需要显式的UInt 转换。

【讨论】:

  • 这个有道理,我试试。我认为我缺少的部分是如何从 Int 转换为 UInt。我试图做像'as Uint'这样的事情,但没有任何效果。
  • 从 Xcode 6.1 开始,您必须使用 Enum(rawValue: value) 而不是 Enum.fromRaw(value)。见这里:Initializing from a Raw Value
  • @Cornelius:你完全正确。我已经修复了答案,感谢您的反馈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多