这两种情况几乎不会同时发生吗?时间流逝是否会如此微不足道,以至于我将代码放入其中并不重要?
编辑:我的问题与那个链接不同,因为我在谈论set和willSet的功能,而链接是在谈论willSet和didSet的功能。因此,正在讨论两个不同的关键字。我知道了willSet和didSet之间的区别,想了解更多关于set和willSet的信息。
答案 0 :(得分:3)
你们都在用官方参考资料解释这个willSet
/ didSet
这个概念做得很好。我想用自己的话说出来:
set
和willSet
之间的 MOST 显着差异是
set
/get
的属性不存储值!!!
请在你的Swifty大脑上记下这一行。
set
/ get
基本上就像通过调用属性引发的两种方法一样。这意味着,使用set
/ get
声明属性不会为该属性分配内存。
相反,
willSet
/didSet
DO 的属性会存储值。
这两个方法在将新值写入属性之前/之后执行。其他答案已经深入解释了这两种方法。
答案 1 :(得分:2)
set和willSet有两个完全不同的用途。
set与其他语言中的setter方法类似,因此程序员清楚地知道为什么以及何时需要/需要使用它。
willSet与触发器相当。因此,每当设置值时 - 这可能超出程序员的影响 - 将调用此函数(除了初始化程序,如其他答案中所述)。
想象一下您创建的公共类,并将其作为框架的一部分提供给其他程序员。 在willSet中,只要设置了值,您就可以触发其他功能(例如,使用时间戳写入日志条目)。此外,它允许您在设置值之前执行任何操作,例如,在覆盖之前将旧值保存到其他位置。
当然,你可以在不使用willSet的情况下完成我在set函数中描述的所有内容。
但是willSet和didSet让你有机会编写更易读的代码:
答案 2 :(得分:1)
willSet
和didSet
被称为 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观察者 授权发生前的初始化程序。