【问题标题】:(iOS 10, Swift 3) Reading `userInfo` dictionary from a CloudKit notification: How do I cast `[AnyHashable : Any]` to `[String : NSObject]`?(iOS 10,Swift 3)从 CloudKit 通知中读取 `userInfo` 字典:如何将 `[AnyHashable : Any]` 转换为 `[String : NSObject]`?
【发布时间】:2017-01-06 00:15:24
【问题描述】:

背景

我正在尝试在我的应用委托中从application:didReceiveRemoteNotification:userInfo:fetchCompletionHandler 加载userInfo 字典。

然后我需要将 userInfo[AnyHashable:Any] 转换为 [String:NSObject],这样我就可以在 CloudKit 的 CKNotification:fromRemoteNotificationDictionary 中使用它。

问题

当我这样做时:

let ui = userInfo as! [String : NSObject]

我得到错误:

'[AnyHashable:Any]' is not convertible to '[String:NSObject]'

有没有更好的方法将userInfo 转换为适当的类型,还是我走错了路?

【问题讨论】:

    标签: notifications cloudkit swift3 ios10


    【解决方案1】:

    您只需先将其转换为NSDictionary,然后再将其转换为[String: NSObject]

    试试这样:

    CKNotification(fromRemoteNotificationDictionary: userInfo as NSDictionary as! [String: NSObject])
    

    【讨论】:

    • 不,如果我这样做,我会得到: Cast from '[AnyHashable : Any]?'到不相关的类型“NSDictionary”总是失败
    • @FabrizioBartolomucci 确保在投射之前打开您的价值。您需要从[AnyHashable: Any] 转换为NSDictionary
    • let d1 : [AnyHashable : Any]? = [1:1]; if let d1 = d1 { d1 as NSDictionary }
    • 不行,CKNotification 的返回完全是空的,对我不起作用。
    • @Loebre 确保您让 Xcode 为您自动完成方法 didReceiveRemoteNotification 声明,您的方法可能没有被调用
    【解决方案2】:

    正如建议的那样,删除所有强制转换并使用 userInfo 就足以让 Swift 3 正确处理事情。

    【讨论】:

    • 这个答案不正确。请参阅上面的 Leo Dabus 接受的答案。
    • 不完全是,至少它编译得很好。相反,双重转换至少在 Swift 3 上无法编译。
    【解决方案3】:
    NSString.localizedStringWithFormat("%@",(notification.userInfo as! [String: AnyObject] as! [String : NSObject])["theKeyValue"]!)
    

    这就是我得到字符串的方式。请随时更正。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      相关资源
      最近更新 更多