在可解码对象上使用 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 一致性,而不是依赖编译器来综合它。