Swift 中 willSet 和 didSet 的用途是什么

作者:编程家 分类: swift 时间:2025-07-15

Swift 中 willSet 和 didSet 的用途是什么?

在 Swift 中,我们可以使用 willSet 和 didSet 关键字来观察属性的值的变化。这两个属性观察器提供了一种简单而强大的方式来响应属性值的变化,并且可以在变化前后执行自定义的代码。本文将详细介绍 willSet 和 didSet 的用途以及如何使用它们。

willSet 和 didSet 的介绍

在介绍 willSet 和 didSet 之前,我们先来了解一下属性观察器的概念。属性观察器是一种特性,它允许我们在属性的值即将被设置或已经被设置后执行自定义的代码。Swift 提供了两种属性观察器:willSet 和 didSet。

willSet

willSet 属性观察器会在属性的值即将被设置之前调用。它接收一个将要被设置的新值的参数,这个参数可以被我们命名为任意的名字。我们可以在 willSet 中使用这个新值来执行一些准备工作,或者对新值进行验证。不过,我们也可以选择不使用这个参数。

下面是一个使用 willSet 的简单例子:

class Person {

var name: String = "" {

willSet {

print("将要设置姓名为:\(newValue)")

}

}

}

let person = Person()

person.name = "Tom"

// Output: 将要设置姓名为:Tom

在上面的例子中,我们定义了一个 Person 类,其中有一个名为 name 的属性。当设置 name 属性时,willSet 观察器会被调用,并且输出将要设置的新值。

didSet

didSet 属性观察器会在属性的值已经被设置后调用。它接收一个表示属性原始值的参数,这个参数可以被我们命名为任意的名字。我们可以在 didSet 中使用这个原始值来执行一些操作,或者与新值进行比较。同样地,我们也可以选择不使用这个参数。

下面是一个使用 didSet 的简单例子:

class Person {

var name: String = "" {

didSet {

print("已经设置姓名为:\(name)")

}

}

}

let person = Person()

person.name = "Tom"

// Output: 已经设置姓名为:Tom

在上面的例子中,我们同样定义了一个 Person 类,并且有一个名为 name 的属性。当设置 name 属性时,didSet 观察器会被调用,并且输出已经设置的新值。

使用 willSet 和 didSet 的场景

willSet 和 didSet 提供了一种在属性值变化前后执行自定义代码的方式,这在很多场景下非常有用。

属性值验证

一个常见的用例是在属性的新值被设置之前对其进行验证。我们可以使用 willSet 观察器来检查新值是否满足特定的条件,如果不满足,我们可以选择不进行设置。

class Person {

var age: Int = 0 {

willSet {

if newValue < 0 {

print("年龄不能为负数")

newValue = 0

}

}

}

}

let person = Person()

person.age = -10

// Output: 年龄不能为负数

在上面的例子中,我们定义了一个 Person 类,并且有一个名为 age 的属性。在将 age 设置为负数之前,willSet 观察器会被调用,并且进行验证。如果新值为负数,将会打印出错误信息,并且将新值强制设置为 0。

属性值更新

另一个常见的用例是在属性的值被更新后执行一些操作。我们可以使用 didSet 观察器来执行这些操作,比如更新界面或者执行其他相关的逻辑。

class ScoreBoard {

var score: Int = 0 {

didSet {

updateUI()

}

}

func updateUI() {

print("当前得分为:\(score)")

}

}

let scoreBoard = ScoreBoard()

scoreBoard.score = 100

// Output: 当前得分为:100

在上面的例子中,我们定义了一个 ScoreBoard 类,并且有一个名为 score 的属性。在 score 的值被更新后,didSet 观察器会被调用,并且调用 updateUI 方法来更新界面。

willSet 和 didSet 属性观察器是 Swift 中非常有用的特性,它们提供了一种简单而强大的方式来观察属性的值的变化并执行自定义的代码。通过合理地运用 willSet 和 didSet,我们可以在属性的值变化前后进行验证、执行操作、更新界面等。