ios - 当你可以改变一个变量并且值无论如何都会改变时,为什么要使用 didSet 呢?

标签 ios swift variables didset property-observer

我通读了这个 SO didSet q&a和苹果的 Property Observers和其他一些帖子。我似乎无法理解的是,如果您在不使用属性观察器的情况下更改变量,它无论如何都会改变,那么在改变变量时使用 didSet 有什么好处?

场景 1:

var someVal = 0

someVal = 10

// someVal now holds 10

场景 2:

var someVal: Int = 0{

    didSet{
    }
}

someVal = 10

// again someVal now holds 10

场景 3:

var someVal: Int = 0{

    didSet{

       if someVal > oldValue{

            someVal = newValue
       }
    }
}

someVal = 10

// once again someVal holds a value of 10

我在场景 3 中唯一看到的是,如果不满足条件,则 someVal 不会改变。但是我可以简单地这样做而不是将它添加到 didSet 中,并且会发生完全相同的事情。

var someVal = 0

var anotherVal = 10

if someVal < anotherValue{
     someVal = anotherValue
}

// once again someVal holds a value of 10

那么除了在 didSet 观察者中添加一个条件还有什么好处呢?

最佳答案

嗯,它是一个观察者。很多时候您想对更改 viewController 属性的值使用react。现在,如果您在 10 个不同的地方修改该属性,您不必复制/粘贴相同的代码 10 次不同的时间 - didSet 观察者会处理这个问题。

例如:

var someVal: Int = 0 {
    didSet {
        somePostprocessing()
    }
}


someVal = 10

// a bit later

someVal = 15

// etc.

优于:

var someVal: Int = 0


someVal = 10
somePostprocessing()

// a bit later

someVal = 15
somePostprocessing()

// etc.

在第一种情况下,您可以确定只要值发生变化,就会发生后处理。在第二种情况下,即使我们愿意接受复制/粘贴(这是不行的),您如何确定在每次修改值时都不会忘记添加 postProcessing?

关于ios - 当你可以改变一个变量并且值无论如何都会改变时,为什么要使用 didSet 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48816846/

相关文章:

ios - 将模拟类注入(inject)到单元测试方法的方法中

javascript - 像文本一样访问变量?

ios - "NSAttributedString initWithData: options: documentAttribute: error:"未按预期工作

iphone - 基于 TabBar 的应用程序中的注销问题

iOS 8 - performSegueWithIdentifier 加载 View 但直到我点击屏幕才显示

ios - 返回上一个屏幕时如何在 Controller 之间传输数据? swift

javascript - jQuery 和 JavaScript 函数

java - 我在多个 View 中需要相同的变量,但它不起作用

ios - 在 ViewController 中使用带有外部数据源和 UITableView 的自定义 UITableViewCell

ios - 在 swift 项目中安装 AWS ios sdk