我仔细阅读了此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观察者中添加一个条件有什么好处?
答案 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的作用有所了解。在上面的示例中,只要模型中的变量值发生更改,视图也会更新。