繁体   English   中英

当您只可以对变量进行突变并且值仍然发生变化时,为什么要使用didSet?

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

我通读了didSetQ& 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观察器中添加条件有什么好处呢?

好吧,它是一个观察者。 很多时候,您想对更改viewController属性的值做出反应。 现在,如果您在10个不同的地方修改该属性, didSet必将相同的代码复制/粘贴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?

假设您有一个数组,该表将提供一个tableView ,该数组可以在代码中的任何位置更改,而无需编写

 self.tableView.reloadData()

每次更改都不要使用didSet

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

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

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的功能。 在上面的示例中,只要模型中变量的值发生更改,视图也会被更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM