Swift 属性观察器 - didset 与 willset 使用的示例

标签 swift properties observer-pattern

我熟悉属性观察者的含义以及如何使用它。 但是,我真正不明白的是何时使用它们中的每一个。 在我看来这无关紧要.. 如果我使用 didset,我可以使用属性本身来使用 oldValue 或新值。如果我使用 willset,我可以使用属性本身来使用 newValue 或旧值。 所以.. didset 中的 oldValue 就像 willset 中的属性本身,willSet 中的 newValue 就像 didset 中的属性本身:

var propObserve = 1 {
    willSet {
       print("my previous value was \(propObserve) and my future value will be \(newValue)")
    }

    didSet {
       print("my previous value was \(oldValue) and my future value will be \(propObserve)")
    }
}

propObserve = 2

我将从他们每个人那里得到相同的打印品。 我知道 willSet 之前执行,didSet 在属性设置为新值之后执行,但我仍然可以在这两种情况下使用新值和旧值(在 willSet 和 didSet 中)

Q1:什么时候更喜欢使用一个而不是另一个? Q2:你能给我一个具体的例子吗?

提前致谢

最佳答案

每个都有很多用例,但这里有几个例子。

使用 willSet 对新值执行验证,将其限制在特定的数值范围内,四舍五入,或将其保存到以前值的历史记录中。使用 willSet 使程序员能够在赋值之前更改值。

使用 didSet 在值更改后执行任何操作,例如更新用户界面、重新加载 TableView 、将某些内容记录到 API 或更改另一个相关值。使用 didSet 分配值并允许根据该分配执行操作。

在其他一些用例中,两者都可以。

关于Swift 属性观察器 - didset 与 willset 使用的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50005913/

相关文章:

c++ - 继承和模板,一种奇怪的行为

ios - 我怎样才能使我的第 3 方键盘显示 'Multiple Languages' 而不仅仅是 'English' ?

ios - ReactiveCocoa 4,根据 UI 事件和验证正确发送我的 HTTP 请求

swift - header 中的返回类型为 "<<error type>>"

java - 找不到资源文件

javascript - 如何在多个订阅变量一起调用时只调用一次函数

iOS 团体照片库照片(按类别)

android - MvxNotifyPropertyChanged 应用程序在 SetProperty 上崩溃

python - 为什么属性必须是 Python 中的类属性?

swift - 将 SwInject 与中央观察者模式结合使用