gpt4 book ai didi

swift - 在 iOS userInfo 上使用 Swift 的 Decodable

转载 作者:行者123 更新时间:2023-12-05 08:48:14 30 4
gpt4 key购买 nike

iOS 从后台通知返回 json 数据,类型为 [AnyHashable : Any]。有没有办法将其解析为实现 Codable 协议(protocol)的结构?

例子:

// Server sends the following data via apn
{"items": [{"id": "192e7926-7891-44eb-8ca7-f795d8552e84", "text": "some text", "num": 0.7}]}

当app端接收到数据时

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print(userInfo["items"])
}

打印语句给出以下输出

Optional(<__NSSingleObjectArrayI 0x283fe80b0>(
{
id = "192e7926-7891-44eb-8ca7-f795d8552e84";
num = "0.7";
text = "Check test";
}
))

我已经有一个匹配的 Codable 结构:

struct Item: Codable {
let id: UUID
let text: String
let num: Double
}

我能以某种方式从 userInfo["items"][0] 实例化一个 Item 吗?显然,只需发送一个编码的 json 字符串就可以解决这个问题,但我很感兴趣是否有一种方法可以将 [AnyHashable : Any] 解码为 Decodable 结构。

谢谢!

最佳答案

您可以使用 JSONSerialization.data(withJSONObject:

将字典转换为 JSON 对象

你可能需要一个容器结构

struct ItemsCollection: Decodable {
let items: [Item]
}
        let dict: [AnyHashable: Any] = your dict
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict)
let itemsCollection = try JSONDecoder().decode(ItemsCollection.self, from: jsonData)
//now access it as itemsCollection.items[0]
}
catch {
print(error)
}

编辑 1:您始终可以通过避免创建新结构来优化解决方案

        let dict: [AnyHashable: Any] = userInfo["items"][0] //not sure if you would need explicit type casting here, cant debug as I dont have actual object
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict)
let item = try JSONDecoder().decode(Item.self, from: jsonData)
//now access item
}
catch {
print(error)
}

关于swift - 在 iOS userInfo 上使用 Swift 的 Decodable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66289345/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com