使用 Mirror(reflecting:) 时无法符合 Decodable

Cannot conform to Decodable when using Mirror(reflecting:)

我正在使用 Decodable 来解码某些 JSON,此结构上的所有属性都具有相同的结构,只是 JSON 将它们包含在多个数组中。在我添加另一个 属性 let all = Mirror(reflecting: Sizes.self).children 之前,代码一直有效。我正在使用它来获取所有属性,这样我就可以遍历结构以实际注入数据。

我遇到的问题是,当我将 all 存储为常量时,代码将无法编译并出现以下错误:

Type 'Sizes' does not conform to protocol 'Decodable'

struct SizeJSON: Decodable {
    var name: String
    var width: Double
    var height: Double
}

struct Sizes: Decodable {
    let small: [SizeJSON]
    let medium: [SizeJSON]
    let large: [SizeJSON]
    let all = Mirror(reflecting: Sizes.self).children
}

Mirrorinit(reflecting:) 初始化程序需要传递一个 实例 你的类型才能工作。

您可以使用惰性变量完成您正在尝试的操作,如下所示:

struct Sizes: Decodable {
    let small: [SizeJSON]
    let medium: [SizeJSON]
    let large: [SizeJSON]
    lazy var all: [SizeJSON] = {
        Mirror(reflecting: self).children
            .compactMap { [=10=].value as? [SizeJSON] }
            .flatMap { [=10=] }
    }()
}

这样你既可以访问 self 实例又可以避免 all 属性 被解码。