我正在尝试对通过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()
}
}
答案 0 :(得分:8)
这应该有效:
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
系统框架,这意味着integerValue
和unsignedIntegerValue
都返回Int
,
并且在任何情况下都需要明确的转换。
或者,您可以从数字创建枚举值(正如@ColinE已经建议的那样) 在评论中)然后使用switch case:
if let r = AVAudioSessionRouteChangeReason(rawValue: UInt(reason.integerValue)) {
switch r {
case .NewDeviceAvailable:
// ...
case .OldDeviceUnavailable:
// ...
default:
// ...
}
} else {
println ("Other reason")
}
出于与上述相同的原因,此处也需要进行明确的UInt
转换。