gpt4 book ai didi

swift - 从 Any 转换为其他任何对象都失败

转载 作者:行者123 更新时间:2023-11-28 14:46:15 26 4
gpt4 key购买 nike

API 返回一个类型为 Any 的变量.打印时看起来像这样。

{
"sender" : "Kira",
"created" : "08.05.2018",
"text" : "Cncncm"
}

我尝试使用 SwiftyJSON像这样转换 let mydata = JSON(data)但它失败了。我尝试使用 Swift 4 解码技术,但也失败了。我试着这样做 let myData = data as? Dictionary<String, String>但它又失败了。

我不知道该怎么办。有什么提示或解决方案吗?

最佳答案

终于有机会展示 Codable 协议(protocol)隐藏的 gem 之一。请在 Playground 中运行以下命令:

import Cocoa

let jsonData = """
{
"sender" : "Kira",
"created" : "08.05.2018",
"text" : "Cncncm"
}
""".data(using: .utf8)!

struct SenderText: Codable {
let sender: String
let created: Date
let text: String
}

let dayFormatter = DateFormatter()
dayFormatter.dateFormat = "dd.MM.yyyy"
let date = dayFormatter.date(from:"08.05.2018")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dayFormatter)

do {
let sendText = try decoder.decode(SenderText.self, from: jsonData)
print(sendText)
} catch {
print(error)
}

定义如此复杂的解析器是多么容易,将一个困惑的 JSON 字符串映射到您最喜欢的 struct 的纯粹优雅几乎永远不会让我惊讶。不管你的日期格式看起来多么奇怪,在这个过程中它离被解析的距离不会超过 3 行。

关于转换,你应该注意一些事情:在 Swift 中,就像在大多数面向对象的语言中一样,你只能转换一些东西到其他东西,如果(且仅当)它已经首先是其他东西(但该知识已在某处丢失)。由于您的 String“只是”一个 String(可能伪装成 Any),您将无法cast 它到其他任何东西。然而,Codable 协议(protocol)为您提供了一种极好的方法,可以非常轻松地从 Strings Datadecode。这个过程不应该被误认为是类型转换,即使它看起来大致相同。它是从一段简单的 Data 创建和初始化另一个结构更合适的对象,您可能从您选择的普通 Web 服务中获得该片段。

到目前为止还不错,至少在我看来是这样。

关于swift - 从 Any 转换为其他任何对象都失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50222930/

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