1

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

场景一:

var someVal = 0

someVal = 10

// someVal now holds 10

场景二:

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 观察者中添加条件之外还有什么好处呢?

4

3 回答 3

4

嗯,它是一个观察者。很多时候,您想对更改 viewController 属性的值做出反应。现在,如果您在 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?

于 2018-02-15T21:52:41.827 回答
2

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

 self.tableView.reloadData()

每次更改都使用 didSet

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

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

于 2018-02-15T21:50:45.203 回答
2

didSetSwift中的一个属性观察者

didSet{

}

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

例如:

在我们看来,我有一个 UILabel(如在 MVC 中)

@IBOutlet weak private var someLabel: UILabel!

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

var someValue: Int = 10

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

这可以通过 didSet 来完成

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

所以在这里你可以对 didSet didSet 做了什么有一些直觉。在上面的示例中,每当模型中变量的值发生更改时,视图也会更新。

于 2018-02-15T22:40:20.500 回答