1

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)在外部定义时,它也可以工作。这些工作案例也在上面链接的示例项目中。

我的问题是为什么运行时错误?这是框架问题还是代码有问题?

4

0 回答 0