使用 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
}
Mirror
的 init(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
属性 被解码。
我正在使用 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
}
Mirror
的 init(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
属性 被解码。