为什么? AVAudioSessionRouteChangeReason返回nil?

时间:2015-09-08 16:47:08

标签: swift avfoundation foundation avaudiosession

我订阅了AVAudioSessionRouteChangeNotification

为什么以下内容会返回nil

notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? AVAudioSessionRouteChangeReason

所有其他选项都有用,例如返回Optional(2)

notification.userInfo?[AVAudioSessionRouteChangeReasonKey]
notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? UInt
notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? NSNumber

我发现第一个选项最清晰/可读。

1 个答案:

答案 0 :(得分:2)

这是因为userInfoNSDictionary,并且您无法向NSDictionary添加Swift枚举常量。但可以添加原始值。

也就是说,将userInfo声明为

之类的内容是不合法的
let userInfo : NSDictionary = [ AVAudioSessionRouteChangeReasonKey : AVAudioSessionRouteChangeReason.NewDeviceAvailable ]

...因为您收到错误cannot convert value of type '[String : AVAudioSessionRouteChangeReason]' to specified type 'NSDictionary'。您可以声明如下:

let userInfo : NSDictionary = [ AVAudioSessionRouteChangeReasonKey : AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue ]

这就是你拥有的东西(或者你拥有的东西,因为框架几乎肯定是使用C或Objective-C而不是Swift)。

由于AVAudioSessionRouteChangeReason被声明为

public enum AVAudioSessionRouteChangeReason : Uint {
...

原始值是无符号整数。您可以使用as?将它们向下转换为整数类型或NSNumber,但它们与实际的枚举类型不同。