何时在Swift中使用set vs willSet?

时间:2015-06-22 21:56:51

标签: swift class set

这两种情况几乎不会同时发生吗?时间流逝是否会如此微不足道,以至于我将代码放入其中并不重要?

编辑:我的问题与那个链接不同,因为我在谈论set和willSet的功能,而链接是在谈论willSet和didSet的功能。因此,正在讨论两个不同的关键字。我知道了willSet和didSet之间的区别,想了解更多关于set和willSet的信息。

3 个答案:

答案 0 :(得分:3)

你们都在用官方参考资料解释这个willSet / didSet这个概念做得很好。我想用自己的话说出来:

setwillSet之间的 MOST 显着差异是

  

set / get的属性存储值!!!

请在你的Swifty大脑上记下这一行。

set / get基本上就像通过调用属性引发的两种方法一样。这意味着,使用set / get声明属性不会为该属性分配内存。

  

相反,willSet / didSet DO 的属性会存储值。

这两个方法在将新值写入属性之前/之后执行。其他答案已经深入解释了这两种方法。

答案 1 :(得分:2)

set和willSet有两个完全不同的用途。

set与其他语言中的setter方法类似,因此程序员清楚地知道为什么以及何时需要/需要使用它。

willSet与触发器相当。因此,每当设置值时 - 这可能超出程序员的影响 - 将调用此函数(除了初始化程序,如其他答案中所述)。

想象一下您创建的公共类,并将其作为框架的一部分提供给其他程序员。 在willSet中,只要设置了值,您就可以触发其他功能(例如,使用时间戳写入日志条目)。此外,它允许您在设置值之前执行任何操作,例如,在覆盖之前将旧值保存到其他位置。

当然,你可以在不使用willSet的情况下完成我在set函数中描述的所有内容。

但是willSet和didSet让你有机会编写更易读的代码:

  • 在设置willSet
  • 中的值之前执行您需要执行的操作
  • 设置
  • 中的值
  • 在didSet
  • 中设置值(例如记录或清理)之后,执行您需要做的任何事情

答案 2 :(得分:1)

willSetdidSet被称为 Property Observers ,因为名称表示他们会观察并回应属性值的变化,这完全取决于您何时使用它取决于你想要存档的日志,基本上就是setSet在值设置之前发生并且didSet恰好在apple documentation之后发生:

  在存储值之前调用

willSet。 didSet被称为

     存储新值后

immediately

 class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}

let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

**两个重要的注释:

注1:**

  

如果为自己的didSet观察者中的属性赋值,   您指定的新值将替换刚刚设置的值。

注2:

  设置属性时,不会调用

willSet和didSet观察者   授权发生前的初始化程序。