- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
Data
中decode
。这个过程不应该被误认为是类型转换,即使它看起来大致相同。它是从一段简单的 Data
创建和初始化另一个结构更合适的对象,您可能从您选择的普通 Web 服务中获得该片段。
到目前为止还不错,至少在我看来是这样。
关于swift - 从 Any 转换为其他任何对象都失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50222930/
我是一名优秀的程序员,十分优秀!