出现此警告是因为具有初始值的不可变属性不参与解码 - 毕竟,它们是不可变的并且它们具有初始值,这意味着初始值永远不会改变。
例如,考虑以下代码:
struct Model: Decodable {
let value: String = "1"
}
let json = """
{"value": "2"}
"""
let decoder = JSONDecoder()
let model = try! decoder.decode(Model.self, from: json.data(using: .utf8)!)
print(model)
这实际上会打印出来Model(value: "1")
,即使我们给它的 jsonvalue
是"2"
.
事实上,你甚至不需要在你正在解码的数据中提供值,因为它有一个初始值!
let json = """
{}
"""
let decoder = JSONDecoder()
let model = try! decoder.decode(Model.self, from: json.data(using: .utf8)!)
print(model) // prints "Model(value: "1")"
将值更改为 var 意味着它将正确解码:
struct VarModel: Decodable {
var value: String = "1"
}
let json = """
{"value": "2"}
"""
let varModel = try! decoder.decode(VarModel.self, from: json.data(using: .utf8)!)
print(varModel) // "VarModel(value: "2")"
如果您看到此错误,则表示您的代码在解码时从未正确解析过相关属性。如果您将其更改为 var,则该属性将被正确解析,这可能是您想要的 - 但是,您应该确保您正在解码的数据始终具有该键集。例如,这将引发异常(并且由于我们使用 而崩溃try!
):
let json = """
{}
"""
let decoder = JSONDecoder()
struct VarModel: Decodable {
var value: String = "1"
}
let varModel = try! decoder.decode(VarModel.self, from: json.data(using: .utf8)!)
总之,Xcode 的建议在许多情况下可能是可行的,但您应该根据具体情况评估将属性更改为 a 是否var
会破坏您的应用程序的功能。
如果您希望属性始终返回硬编码的初始值(这就是现在发生的情况),请考虑将其设为计算属性或惰性 var。