我目前正在处理Codable项目中的类型并遇到问题.
struct Person: Codable
{
var id: Any
}
Run Code Online (Sandbox Code Playgroud)
id在上面的代码中可以是a String或an Int.这就是id类型的原因Any.
我知道Any不是Codable.
我需要知道的是我如何才能使它发挥作用.
我收到以下错误:
Generic parameter 'T' could not be inferred
在线: let data = try encoder.encode(obj)
这是代码
import Foundation
struct User: Codable {
var firstName: String
var lastName: String
}
let u1 = User(firstName: "Ann", lastName: "A")
let u2 = User(firstName: "Ben", lastName: "B")
let u3 = User(firstName: "Charlie", lastName: "C")
let u4 = User(firstName: "David", lastName: "D")
let a = [u1, u2, u3, u4]
var ret = [[String: Any]]()
for i in 0..<a.count {
let param = [
"a" : a[i], …Run Code Online (Sandbox Code Playgroud) 我想在Swift中表示一个通用的JSON对象:
let foo: [String: Any] = [
"foo": 1,
"bar": "baz",
]
Run Code Online (Sandbox Code Playgroud)
但[String: Any]编译器建议的类型并不能很好地工作.我无法检查该类型的两个实例是否相等,例如,虽然这应该可以使用两个JSON树.
什么也行不通的是使用Codable机器将该值编码为JSON字符串:
let encoded = try JSONEncoder().encode(foo)
Run Code Online (Sandbox Code Playgroud)
哪个因错误而爆炸:
fatal error: Dictionary<String, Any> does not conform to Encodable because Any does not conform to Encodable.
Run Code Online (Sandbox Code Playgroud)
我知道我可以引入一个精确的类型,但我遵循通用的JSON结构.我甚至尝试为泛型JSON引入一种特定类型:
enum JSON {
case string(String)
case number(Float)
case object([String:JSON])
case array([JSON])
case bool(Bool)
case null
}
Run Code Online (Sandbox Code Playgroud)
但是当实现Codable这个枚举时我不知道如何实现encode(to:),因为一个键控容器(用于编码对象)需要一个特定的CodingKey参数,我不知道如何得到它.
是否真的不可能创建一个Equatable通用的JSON树并使用它编码Codable?