在可解码对象上使用 DidSet 或 WillSet
using DidSet or WillSet on decodable object
我目前有一个 Codable 对象,我正在使用它进行初始化:
let decoder = JSONDecoder()
let objTest: TestOBJClass = try! decoder.decode(TestOBJClass.self, from: data)
TestOBJClass:
public class TestOBJClass: Codable {
var name: String
var lastname: String?
var age: Int? {
DidSet {
//Do Something
}
}
}
对象初始化没有问题。但是,未调用 age 变量上的 DidSet 函数。在处理 Decodable 或 Encodable 对象时,我们能否使用这些函数?感谢您的帮助!
正如@Larme 在评论中指出的那样,属性 像 didSet
这样的观察者不会在初始化器中被调用,包括 Codable
一致性。如果您想要这种行为,请将 didSet
中的代码重构为一个单独的命名函数,然后在初始化程序的末尾调用该函数。
struct MyStruct: Codable
{
...
var isEnabled: Bool {
didSet { didSetIsEnabled() }
}
func didSetIsEnabled() {
// Whatever you used to do in `didSet`
}
init(from decoder: Decoder) throws
{
defer { didSetIsEnabled() }
...
}
}
当然,这确实意味着您需要显式实现 Codable
一致性,而不是依赖编译器来综合它。
我目前有一个 Codable 对象,我正在使用它进行初始化:
let decoder = JSONDecoder()
let objTest: TestOBJClass = try! decoder.decode(TestOBJClass.self, from: data)
TestOBJClass:
public class TestOBJClass: Codable {
var name: String
var lastname: String?
var age: Int? {
DidSet {
//Do Something
}
}
}
对象初始化没有问题。但是,未调用 age 变量上的 DidSet 函数。在处理 Decodable 或 Encodable 对象时,我们能否使用这些函数?感谢您的帮助!
正如@Larme 在评论中指出的那样,属性 像 didSet
这样的观察者不会在初始化器中被调用,包括 Codable
一致性。如果您想要这种行为,请将 didSet
中的代码重构为一个单独的命名函数,然后在初始化程序的末尾调用该函数。
struct MyStruct: Codable
{
...
var isEnabled: Bool {
didSet { didSetIsEnabled() }
}
func didSetIsEnabled() {
// Whatever you used to do in `didSet`
}
init(from decoder: Decoder) throws
{
defer { didSetIsEnabled() }
...
}
}
当然,这确实意味着您需要显式实现 Codable
一致性,而不是依赖编译器来综合它。