我使用Decodable
来解码一些JSON,这个结构上的所有属性都有相同的结构,只是JSON将它们包含在多个数组中。在添加另一个属性let all = Mirror(reflecting: Sizes.self).children
之前,代码一直有效。我使用它是为了获得所有的属性,这样我就可以在结构上循环来实际地嘲笑数据。
我遇到的问题是,当我将all
存储为常量时,代码将不会编译,并给出以下错误:
类型"大小"不符合协议"可解码">
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
}
Mirror
的init(reflection:(初始值设定项需要传递您类型的实例才能工作。
你可以使用一个惰性变量来完成你正在尝试的事情,比如:
struct Sizes: Decodable {
let small: [SizeJSON]
let medium: [SizeJSON]
let large: [SizeJSON]
lazy var all: [SizeJSON] = {
Mirror(reflecting: self).children
.compactMap { $0.value as? [SizeJSON] }
.flatMap { $0 }
}()
}
这样,您既可以访问self
实例,又可以避免对all
属性进行解码。