Swift 从任何类型转换到任何其他类型都会失败
API返回一个类型为Swift 从任何类型转换到任何其他类型都会失败,swift,ably-realtime,Swift,Ably Realtime,API返回一个类型为Any的变量。我打印的时候是这样的 { "sender" : "Kira", "created" : "08.05.2018", "text" : "Cncncm" } 我尝试使用SwiftyJSON像这样强制转换它let mydata=JSON(data),但失败了。我尝试使用Swift 4解码技术,但也失败了。我试着这样做让myData=data作为?字典,但它再次失败 我不知道在这里该做什么。有什么提示或解决方案吗?您可以像这样解析它,因为它是一个json
Any
的变量。我打印的时候是这样的
{
"sender" : "Kira",
"created" : "08.05.2018",
"text" : "Cncncm"
}
我尝试使用SwiftyJSON
像这样强制转换它let mydata=JSON(data)
,但失败了。我尝试使用Swift 4解码技术,但也失败了。我试着这样做让myData=data作为?字典
,但它再次失败
我不知道在这里该做什么。有什么提示或解决方案吗?您可以像这样解析它,因为它是一个json字符串
let trd = yourVar as? String
if let data = trd?.data(using: String.Encoding.utf8) {
do {
var content = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:String]
print(content)
}
catch let error as NSError {
print(error)
}
}
最后,有机会展示一个
可编码的协议隐藏的宝石。请在操场上跑步:
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中,就像在大多数面向对象语言中一样,只有当(并且仅当)某个东西在一开始就已经是其他东西时(但这些知识已经丢失在某处),您才能将它强制转换为其他东西。由于您的字符串
只是一个字符串
(可能是以任何
为伪装),因此您无法将其转换为其他任何内容。然而,Codable
协议为您提供了从字符串
数据
进行解码
的绝好方法。这一过程不应被误认为是演员阵容,即使看起来基本相同。它是从一个简单的数据
创建和初始化另一个结构更合适的对象,您可能从您选择的普通web服务中获得该数据
到目前为止很好,至少在我的书中是这样。是String
?什么API?文件上怎么说?您可以使用类型(of:)
来确定变量的实际值它是异常的字符串
。真是一个facepalm。如果结果类型应该是数组或字典,请停止建议.allowFragments
。删除选项
参数。转换到n错误的桥接是冗余的。只要抓住{
就足够了。