swift - 在可解码对象上使用 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 对象时,我们是否能够使用这些函数?感谢您的帮助!
解决方案
正如@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
一致性,而不是依赖编译器来综合它。
推荐阅读
- css - 将“重复”与“自动调整”和固定宽度列组合在一个“网格模板列”中
- flutter - google ml 套件安装包:google_ml_kit_example
- php - PHP读取在线Excel文件而不下载文件
- python - 看不到 2 个数据帧之间有什么区别
- reactjs - React 中的条件列表渲染
- c++ - OpenGL项目不会打开显示窗口
- python - 多处理查找进程索引?
- python - 在 Django 中,根据模型中其他字段中选择的值删除选择字段下拉列表中的选项
- python-3.7 - sudo python3 无法获得 root 访问权限
- python-3.x - 解析两个 JSON 文件