Swift 4 的 Foundation 库现在有一个内置的 JSON 解析器。它运行良好,除了我在以特定方式使用它时遇到的问题。如果正在解码的对象在另一个结构中被引用为泛型(下面的示例),则解码器会生成运行时错误:
GenericCache(0x106a31830):检测到循环元数据依赖,正在中止
这是从服务返回的示例 JSON 字符串:
{"data": { "type": "foo", "attributes": { "name": "Fooey McFooface", "age": 23 }}}
以下是两个对应的 Swift 4 数据模型:
struct GenericWrapper<S: Codable>: Codable {
struct GenericWrapperData<T: Codable>: Codable {
let type: String
let attributes: T
}
let data: GenericWrapperData<S>
}
public struct Foo: Codable {
var name: String?
var age: Int?
}
鉴于上述示例,此代码将触发运行时错误:
JSONDecoder().decode(GenericWrapper<Foo>.self, from: jsonData)
这是一个演示上述代码的项目:
https://github.com/UberNick/CodeableGenericBug
我想知道 GenericWrapper 使用的嵌套结构是否有问题。许多使用 Codable 的指南在他们的示例中使用了这些指南。当内部结构的变量定义“attributes:T”被诸如“attributes:Foo”之类的具体类型替换时,嵌套结构确实起作用。当内部结构(GenericWrapperData)在外部定义时,它也可以工作。这些工作案例也在上面链接的示例项目中。
我的问题是为什么运行时错误?这是框架问题还是代码有问题?