使用镜像(反射:)时无法符合"可解码"



我使用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属性进行解码。

最新更新