Это предупреждение появляется потому, что неизменяемые свойства с начальными значениями не участвуют в декодировании — ведь они неизменяемые и у них есть начальное значение, а значит, начальное значение никогда не изменится.
Например, рассмотрим этот код:
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")
, даже если в json, который мы ему дали, было value
как "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, вероятно, жизнеспособно во многих случаях, но вы должны оценивать в каждом конкретном случае, не нарушит ли изменение свойства на var
функциональность вашего приложения.
Если вы хотите, чтобы свойство всегда возвращало жестко запрограммированное начальное значение (что и происходит прямо сейчас), подумайте о том, чтобы сделать его вычисляемым свойством или отложенной переменной.
person
Noah Gilmore
schedule
24.06.2020