首页 > 解决方案 > 在可解码对象上使用 DidSet 或 WillSet

问题描述

我目前有一个 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
        }
    }
}

对象被初始化没有问题。但是,年龄变量上的 DidSet 函数没有被调用。在使用 Decodable 或 Encodable 对象时,我们是否能够使用这些函数?感谢您的帮助!

标签: swiftswift5

解决方案


正如@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一致性,而不是依赖编译器来综合它。


推荐阅读