【发布时间】:2018-06-25 03:00:26
【问题描述】:
我想在 Swift Coding/Encoding 功能完成对 JSON 的解码后执行一些初始化逻辑。
struct MyStruct: Codable {
let id: Int
var name: String
init() {
name = "\(id) \(name)"
}
}
但我得到编译器错误:
Return from initializer without initializing all stored properties
这对我来说很清楚,因为 init() 希望我初始化所有属性。但是添加一个包含所有需要的属性的 init() 也不能解决它,因为当 Codable 启动时,这个初始化器不会被调用(!):
init(id: Int, name: String) {
// This initializer is not called if Decoded from JSON!
self.id = id
self.name = "\(id) \(name)"
}
尽管如此 - 有没有办法在解码完成后执行一些初始化逻辑,但无需手动为每个属性进行所有解码?所以不用每次都执行init(from decoder: Decoder)。在这个简短的示例中,我只有两个简单的属性,但生产代码包含数千个。
谢谢。
【问题讨论】:
-
为什么不将
name作为计算属性? -
你的 json 是否包含“name”键?
-
谢谢,但这只是一个例子。我需要的是一种运行初始化逻辑的方法。
-
我认为这是不可能的。我要么屈服并实现了
init(from:),要么采用了我在JSON解码后手动调用的finializeInit()方法。 -
@Gereon 你能解释一下你的 finalizeInit 方法吗?我不清楚。谢谢。
标签: json swift codable decodable