为什么? 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
,但它们与实际枚举类型不同。
我订阅了 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
,但它们与实际枚举类型不同。