Swift 中何时使用 set 与 willSet?

When to use set vs willSet in Swift?

两者不会几乎同时发生吗?时间流逝会不会如此微不足道,以至于我将代码放入哪个并不重要?

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

willSetdidSet 被称为 属性 观察者 ,顾名思义,他们观察并响应 [=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 这个概念,并附有官方参考资料。我想用我自己的话说:

setwillSet 之间的显着区别是

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
  • 中设置值(例如记录或清理)后做任何你需要做的事情