Swift 中何时使用 set 与 willSet?
When to use set vs willSet in Swift?
两者不会几乎同时发生吗?时间流逝会不会如此微不足道,以至于我将代码放入哪个并不重要?
编辑:我的问题与 link 不同,因为我在谈论 set 和 willSet 的功能,而 link 在谈论 willSet 和 didSet 的功能。因此,正在讨论两个不同的关键字。我知道 willSet 和 didSet 的区别,想了解更多关于 set 和 willSet 的知识。
willSet
和 didSet
被称为 属性 观察者 ,顾名思义,他们观察并响应 [=32] 中的变化=] 的值,何时使用它完全取决于您,具体取决于您要存档的日志,基本上 willSet 发生在值设置之前, didSet 发生在之后,来自 apple documentation:
willSet
is called just before the value is stored. didSet is called
immediately
after the new value is stored.
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:**
If you assign a value to a property within its own didSet observer,
the new value that you assign will replace the one that was just set.
注二:
willSet and didSet observers are not called when a property is set in
an initializer before delegation takes place.
你们都很好地解释了 willSet
/ didSet
这个概念,并附有官方参考资料。我想用我自己的话说:
最 set
和 willSet
之间的显着区别是
Properties with set
/ get
do NOT store values!!!
请将此行记在你的 Swifty 大脑中。
set
/ get
基本上就像调用 属性 调用的两种方法一样。这意味着,用 set
/ get
声明 属性 不会为 属性.
分配内存
On the contrary, properties with willSet
/ didSet
DO store values.
而这两个方法在将新值写入属性之前/之后执行。其他答案已经对这两种方法进行了深入的解释。
set 和 willSet 有两个完全不同的目的。
set 与其他语言中的 setter 方法的用法类似,因此程序员清楚地知道他 wants/needs 为什么以及何时使用它。
willSet 相当于触发器。因此,无论何时设置值——这可能不受程序员的影响——都会调用此函数(其他答案中所述的初始化程序除外)。
想象一下您创建的 public class 并作为框架的一部分提供给其他程序员。
在 willSet 中,您可以在设置值时触发其他功能(例如,写入带有时间戳的日志条目)。此外,它允许您在设置值之前执行任何操作,例如在旧值被覆盖之前将其保存到其他地方。
当然,您可以在不使用 willSet 的情况下完成我在 set 函数中描述的所有操作。
但是 willSet 和 didSet 让您有机会编写可读性更好的代码:
- 在 willSet
中设置值之前做任何你需要做的事情
- 设置set中的值
- 在 didSet
中设置值(例如记录或清理)后做任何你需要做的事情
两者不会几乎同时发生吗?时间流逝会不会如此微不足道,以至于我将代码放入哪个并不重要?
编辑:我的问题与 link 不同,因为我在谈论 set 和 willSet 的功能,而 link 在谈论 willSet 和 didSet 的功能。因此,正在讨论两个不同的关键字。我知道 willSet 和 didSet 的区别,想了解更多关于 set 和 willSet 的知识。
willSet
和 didSet
被称为 属性 观察者 ,顾名思义,他们观察并响应 [=32] 中的变化=] 的值,何时使用它完全取决于您,具体取决于您要存档的日志,基本上 willSet 发生在值设置之前, didSet 发生在之后,来自 apple documentation:
willSet
is called just before the value is stored. didSet is called
immediately
after the new value is stored.
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:**
If you assign a value to a property within its own didSet observer, the new value that you assign will replace the one that was just set.
注二:
willSet and didSet observers are not called when a property is set in an initializer before delegation takes place.
你们都很好地解释了 willSet
/ didSet
这个概念,并附有官方参考资料。我想用我自己的话说:
最 set
和 willSet
之间的显着区别是
Properties with
set
/get
do NOT store values!!!
请将此行记在你的 Swifty 大脑中。
set
/ get
基本上就像调用 属性 调用的两种方法一样。这意味着,用 set
/ get
声明 属性 不会为 属性.
On the contrary, properties with
willSet
/didSet
DO store values.
而这两个方法在将新值写入属性之前/之后执行。其他答案已经对这两种方法进行了深入的解释。
set 和 willSet 有两个完全不同的目的。
set 与其他语言中的 setter 方法的用法类似,因此程序员清楚地知道他 wants/needs 为什么以及何时使用它。
willSet 相当于触发器。因此,无论何时设置值——这可能不受程序员的影响——都会调用此函数(其他答案中所述的初始化程序除外)。
想象一下您创建的 public class 并作为框架的一部分提供给其他程序员。 在 willSet 中,您可以在设置值时触发其他功能(例如,写入带有时间戳的日志条目)。此外,它允许您在设置值之前执行任何操作,例如在旧值被覆盖之前将其保存到其他地方。
当然,您可以在不使用 willSet 的情况下完成我在 set 函数中描述的所有操作。
但是 willSet 和 didSet 让您有机会编写可读性更好的代码:
- 在 willSet 中设置值之前做任何你需要做的事情
- 设置set中的值
- 在 didSet 中设置值(例如记录或清理)后做任何你需要做的事情