我订阅了AVAudioSessionRouteChangeNotification
。
为什么以下内容会返回nil
?
notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? AVAudioSessionRouteChangeReason
所有其他选项都有用,例如返回Optional(2)
:
notification.userInfo?[AVAudioSessionRouteChangeReasonKey]
notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? UInt
notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? NSNumber
我发现第一个选项最清晰/可读。
答案 0 :(得分:2)
这是因为userInfo
是NSDictionary
,并且您无法向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
,但它们与实际的枚举类型不同。