【问题标题】:Why as? AVAudioSessionRouteChangeReason returns nil?为什么作为? AVAudioSessionRouteChangeReason 返回零?
【发布时间】:2015-09-08 16:47:08
【问题描述】:

我订阅了AVAudioSessionRouteChangeNotification

为什么下面会返回nil

notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? AVAudioSessionRouteChangeReason

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

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

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

编辑 2021-04-15:

在当前的 Xcode 版本 12.4 (Swift 5.3.2) 中,它不会返回 nil。现在可以使用以下方法:

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

【问题讨论】:

    标签: swift avfoundation foundation avaudiosession


    【解决方案1】:

    这是因为userInfo 是一个NSDictionary,你不能将Swift 枚举常量添加到NSDictionary。不过,您可以添加原始值。

    也就是说,将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,但它们与实际的枚举类型不同。

    【讨论】:

    • 哦,我不知道/意识到您不能将 Swift 枚举放入 NSDictionary。现在它是有道理的。因为您无法使用 as? 运算符将原始值 (UInt) 2 转换为 AVAudioSessionRouteChangeReason,所以它不起作用。当您尝试直接执行此操作时,您会收到编译器警告 (Cast from 'UInt' to unrelated type 'AVAudioSessionRouteChangeReason' always fails)。当尝试从NSDictionary 转换值时,编译器可能会发出类似的警告,但它总是失败。我会归档一个雷达。感谢您的澄清!
    • 仅供参考,它现在可以工作(在当前版本的 Swift 中)。它不返回nil。现在还可以执行以下操作:`let userInfo : NSDictionary = [ AVAudioSessionRouteChangeReasonKey : AVAudioSession.RouteChangeReason.newDeviceAvailable ]'。
    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多