gpt4 book ai didi

arrays - 如果数组元素的属性发生变化,如何触发操作?

转载 作者:搜寻专家 更新时间:2023-11-01 06:33:42 24 4
gpt4 key购买 nike

在 Swift 中,我有一个数据模型,它使用显示在 TableView 中的项目数组。
数据模型可以随时通过各种来源更改,我想在更改时重新加载 TableView 。

如果项目数组本身发生了变化,这就非常简单了,例如通过为数据模型的数组属性分配一个新数组:setter 可以触发重新加载,例如通过 KVO。
但是,如果仅通过更改其属性之一来更改数组元素(项目),则 TableView 重新加载必须由项目属性的 setter 触发。
如果每个项目都有对存储项目数组的数据模型的引用,这将是可能的:使用此引用,数据模型可以收到项目更改的通知,并触发 TableView 的重新加载。但是,我认为如果数组元素引用了它的数组,那不是一种好的编程风格。

因此,如果数组元素(项目)只能由数据模型本身更改,则另一种选择。在这种情况下,项目属性的 setter 应该只对数据模型可用。实现这一点的一种方法是在同一个文件中定义用户模型类和项目类,并将项目的属性 setter 声明为 fileprivate。然后,只有数据模型可以更改项目的属性。但是仅出于这个原因将两个类都定义在一个文件中,在我看来并不是很优雅。

有没有更直接的方法来处理这种情况?

最佳答案

另一种解决方案是使用协议(protocol)编写您自己的简单观察系统。优点是它使一切都更加松散耦合,并且可以轻松扩展以供将来使用:

class MyElement {
var property = "Test" {
didSet {
guard property != oldValue else { return }
for observer in observers {
observer.didChangeProperty(element: self)
}
}
}

var observers: [MyElementObserver] = []
}

protocol MyElementObserver {
func didChangeProperty(element: MyElement)
}

extension MyElementObserver {
func didChangeProperty(element: MyElement) {}
}

然后您可以使您的 View 符合此协议(protocol)并处理将其自身添加到每个元素的 observers 数组中,或者您可以走可能更干净的路线并创建一个 MyDataModelObserver 协议(protocol),然后让您的数据模型观察它的元素并将这些通知传递给它的观察者(即 View )。

关于arrays - 如果数组元素的属性发生变化,如何触发操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44218463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com