我有以下内容struct
struct Checklist : Codable {
let id: Int64
var text: String?
var checked: Bool
var visible: Bool
var version: Int64
private enum CodingKeys: String, CodingKey {
case id
case text
case checked
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到编译器错误
类型“清单”不符合“可解码”协议
我可以解决的唯一方法是将排除的属性更改为可选。
struct Checklist : Codable {
let id: Int64
var text: String?
var checked: Bool
var visible: Bool?
var version: Int64?
private enum CodingKeys: String, CodingKey {
case id
case text
case checked
}
}
Run Code Online (Sandbox Code Playgroud)
我可以知道为什么会这样吗?这是解决此类编译器错误的唯一正确方法吗?
它们不必是可选的,但它们必须有一些初始值,例如
struct Checklist : Codable {
let id: Int64
var text: String?
var checked: Bool
var visible: Bool = false
var version: Int64 = 0
private enum CodingKeys: String, CodingKey {
case id
case text
case checked
}
}
Run Code Online (Sandbox Code Playgroud)
否则,当通过合成从外部表示创建实例时,这些属性将是未定义的
init(from decoder: Decoder)
Run Code Online (Sandbox Code Playgroud)
方法。或者,您可以自己实现该方法,确保所有属性都已初始化。
选项具有隐式初始值nil,这就是您的解决方案也有效的原因。
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |