为什么? AVAudioSessionRouteChangeReason returns 无?

Why as? AVAudioSessionRouteChangeReason returns nil?

我订阅了 AVAudioSessionRouteChangeNotification

为什么下面 returns nil?

notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? AVAudioSessionRouteChangeReason

所有其他选项都有效,例如return Optional(2):

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

我觉得第一个选项最多clear/readable。

编辑 2021-04-15:

在当前的 Xcode 版本 12.4 (Swift 5.3.2) 中没有 return nil。以下现在有效:

notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? AVAudioSession.RouteChangeReason

因为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,但它们与实际枚举类型不同。