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

Why use didSet when you can just mutate a variable and the value changes anyway?

我通读了这篇 SO didSet q&a and Apple’s 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 观察者中添加一个条件还有什么好处?

假设你有一个数组,它提供了一个 tableView 可以在代码中的任何地方更改该数组而不是编写

 self.tableView.reloadData()

每一次改变都需要使用 didSet

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

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

嗯,这是一个观察者。很多时候您想对 viewController 属性 的值做出反应。现在,如果您在 10 个不同的地方修改 属性,您不必 copy/paste 相同的代码 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.

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

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 的作用。在上面的示例中,每当模型中变量的值发生变化时,视图也会更新。