Cocoa 如何将NSNumber与swift枚举值进行比较?

Cocoa 如何将NSNumber与swift枚举值进行比较?,cocoa,swift,Cocoa,Swift,我试图对通过NSNotification接收的值和枚举值进行简单比较。我有一些有效的方法,但我不相信这是正确的方法。基本上,我最终得到的解决方案是将NSNumber转换为Int,并获取枚举值的rawValue,将其包装为NSNumber,然后获取该值的integerValue 我尝试的其他方法都导致编译器错误,无法在Uint 8和Int或类似的东西之间进行转换 observer = NSNotificationCenter.defaultCenter().addObserverForNa

我试图对通过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()
        }
    }
这应该起作用:

if reason.integerValue == Int(AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue) {
    // ...
}
备注:
AVAudioSessionRouteChangeReason
枚举使用
UInt
作为原始值类型,因此 可以预期,这在没有显式转换的情况下是有效的:

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

}
但是,从Xcode 6 beta 4开始,
NSUInteger
被映射到OSX和iOS中的Swift的
Int
系统框架,这意味着
integerValue
unsignedIntegerValue
都返回
Int
, 在任何情况下都需要显式转换

或者,您可以根据该数字创建枚举值(正如@ColinE所建议的那样) 在注释中),然后使用开关案例:

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

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

改用
fromRaw
如何?这很有意义,我将尝试一下。我想我缺少的部分是如何从Int转换为UInt。我试着做一些类似于'as Uint'的事情,但没有任何效果。因为Xcode 6.1,你必须使用
Enum(rawValue:value)
而不是
Enum.fromRaw(value)
。看这里:@Cornelius:你完全正确。我已经修正了答案,谢谢你的反馈!