为什么当你可以改变一个变量并且值仍然改变时使用didSet?

时间:2018-02-15 21:46:31

标签: ios swift variables didset property-observer

我仔细阅读了此SO didSet q&a和Apple的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观察者中添加一个条件有什么好处?

3 个答案:

答案 0 :(得分:4)

嗯,这是一个观察者。很多时候,您希望对更改viewController属性的值做出反应。现在,如果您在10个不同的地方修改该属性,则不必在10次不同的时间内复制/粘贴相同的代码 - didSet观察者将负责处理。

E.g:

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。在第二种情况下,即使我们愿意接受复制/粘贴(这不行),您如何确保在每次修改值时都不会忘记添加postProcessing?

答案 1 :(得分:2)

假设您有一个数组,tableView数组可以在代码中的任何位置更改数组而不是写入

 self.tableView.reloadData()

每次改变它都会使用didSet

var someVal: [String] = [] { 
   didSet{ 
    self.tableView.reloadData()
   }
}

这是一个简单的例子,有许多有用的案例

答案 2 :(得分:2)

didSet Swift

中的属性观察者
didSet{

}

didSet是一个属性观察者。它用于在设置特定值时执行某些任务。

例如:

我们的视图中有一个UILabel(如在MVC中)

@IBOutlet weak private var someLabel: UILabel!

我们在程序模型中的另一个变量中有它的值,如(MVC)中的

var someValue: Int = 10

所以当我在模型中更新我的变量时,视图中的UILabel也应该更新。

这可以通过didSet as

来完成
var someValue: String = "Hello"{
    didSet{
        someLabel.text = someValue
    }
}

所以在这里你可以对didSet didSet的作用有所了解。在上面的示例中,只要模型中的变量值发生更改,视图也会更新。