代码之家  ›  专栏  ›  技术社区  ›  andesta.erfan

将userinfo[anyhashable:any]转换为[string:any]

  •  0
  • andesta.erfan  · 技术社区  · 6 年前

    我收到通知了 didreceiveRemoteNotification 但我不能将userinfo强制转换为[字符串:any]类型的字典

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        let dict = userInfo as! [String: Any]
        if let response = dict["message"] as? [String: Any], let baseResponse = Mapper<NotificationModel>().map(JSON: response) {
          //do some stuff
        }
    }
    

    当我试图将dict[“message”]强制转换为![string:any]发生错误,并显示:

    无法将类型为“u nscfstring”(0x1cfa84f90)的值强制转换为“nsdictionary”(0x1cfa85bc0)。

    以下是我在控制台打印时的dict[“message”]

    **可选 -一些:“发送者”:

    “avatar_url”:“http://api.moneyar.com/apis/images/15783070400.jpg”,“user_id”:“15783”,“name”:“mahdi moqadasi”

    ,“conversation_id”:“15783”

    ,“消息ID”:103597,

    “时间”:1546778745,

    “type”:1,“message”:“foo”

    ***

    2 回复  |  直到 6 年前
        1
  •  1
  •   Larme    6 年前

    对于下面的答案,代码没有针对编译器进行测试,可能存在一些容易解决的打字错误问题,其中一些问题是故意执行其背后的逻辑,而不是添加 if let / guard let , as? 等,但在解释中添加噪音。

    我不会重复 @vadian answer 这是正确的,解释为什么失败。

    所以我们很清楚 dict["message"] 是一个 String .

    JSON缩写中似乎缺少的一条信息是表示“n”:符号的。

    当你打印的时候 DITE[ [消息] ] ,您没有真正的key/value对象,您有一个表示key-value对象的字符串,但不是以swift表示。您将JSON字符串化(因为它显然比十六进制数据JSON更可读)。如果在你打印答案之后 jsonDict ,您将看到输出结构可能不同。

    因此,一如既往,您的基本工具是:

    Data <== data(encoding:)/init(data:encoding:) ==> String
    Data <== jsonObject(with:options:)/data(withJSONObject:options:) ==> Array or Dictionary //I bypass voluntarily the specific case of String at top level
    

    那我们开始吧!

    let jsonStringifiedString = dict["message"] as String
    let jsonStringifiedData = jsonStringifiedString.data(using: .utf8) as Data
    let jsonDict = try JSONSerialization.jsonObject(with: jsonStringifiedData, options: []) as [String: Any]
    let baseResponse = Mapper<NotificationModel>().map(JSON: jsonDict)
    

    如果我是你,我会调查 Mapper 如果无法做到:

    let baseResponse = Mapper<NotificationModel>().map(JSONData: jsonStringifiedData)
    

    let baseResponse = Mapper<NotificationModel>().map(JSONString: jsonStringifiedString)
    

    因为有时json中嵌入了jsonStringified,您可能需要在 或在 Data 直接。 或者仅仅因为 URLSession 请求返回 数据 对象在其闭包中,您希望直接使用它。

        2
  •  1
  •   vadian    6 年前

    误差

    无法将类型为“u nscfstring”(0x1cfa84f90)的值强制转换为“nsdictionary”(0x1cfa85bc0)。

    是清楚的。键的值 message 是一个字符串

    • 类型的 真实的 类型
    • 是预期的 错误的 类型

    if let response = dict["message"] as? String, ...