【发布时间】:2018-05-01 03:45:00
【问题描述】:
我正在使用一个协议来创建几个结构,我使用这些结构来使用JSONDecoder 进行解码。这是我想要实现的代码示例。
protocol Animal: Codable
{
var name: String { get }
var age: Int { get }
}
struct Dog: Animal
{
let name: String
let age: Int
let type: String
}
struct Cat: Animal
{
let name: String
let age: Int
let color: String
}
以下是 dog 和 cat 的单独 JSON 有效负载:
{
"name": "fleabag",
"age": 3,
"type": "big"
}
{
"name": "felix",
"age": 2,
"color": "black"
}
所以当我解码 JSON 时,我不确定我会得到什么 JSON,狗还是猫。我试过这样做:
let data = Data(contentsOf: url)
let value = JSONDecoder().decode(Animal.self, from: data)
但最终会出现这个错误:
在参数类型“Animal.Protocol”中,“Animal”不符合预期的“Decodable”类型
关于解析返回Animal 实例的狗或猫的最佳方法有什么想法吗?
谢谢
【问题讨论】:
-
狗和猫也需要 Codable 协议
-
鉴于上面的 JSON,这是无法解决的。 JSON 中没有任何内容表明这是 Dog、Cat 还是任何其他可能符合 Animal 的无限类型。如果您知道“这是一只狗还是一只猫”,那么上面的内容是绝对可以解决的(前提是您有一个测试来确定 JSON 中的猫与狗,例如“狗有一个类型”),但不是“它是一只动物” 。”它可能是您的模块不知道的动物(可能在另一个模块中定义)。这也可以通过类型擦除来解决,但你会得到一个 AnyAnimal,而不是 Dog 或 Cat。
标签: swift protocols jsondecoder