set 和 didSet 之间的根本区别是什么

swift

1个回答

写回答

晨海

2025-06-12 19:40

+ 关注

Swift
Swift

set 和 didSet 是 Swift 语言中属性观察器的两种类型。它们的根本区别在于它们被执行的时间点和执行的上下文。在本文中,我们将深入探讨 set 和 didSet 的区别,并提供一些案例代码来帮助理解。

set 和 didSet 的基本概念

在开始之前,让我们先了解一下 set 和 didSet 的基本概念。set 是一个属性观察器,用于监视属性值的变化,并在新值被存储之前执行一些自定义的代码。相反,didSet 也是一个属性观察器,但它在属性值被更改之后立即执行。

set 和 didSet 的执行时机

一个属性可以同时拥有 set 和 didSet,也可以只有其中一个。set 在给属性赋值之前执行,而 didSet 在属性值被更改之后立即执行。这意味着 set 可以在新值被存储之前验证或修改属性的值,而 didSet 可以在属性值被更改后执行一些额外的操作。

例如,我们有一个名为 age 的属性:

var age: Int {

set {

if newValue < 0 {</p> print("年龄不能为负数")

} else {

_age = newValue

}

}

get {

return _age

}

}

在上面的代码中,set 方法中的自定义代码会在赋值操作之前执行。如果新值小于 0,它会打印一条错误消息。否则,它会将新值存储到一个私有变量 _age 中。

接下来,我们可以使用 didSet 来执行一些额外的操作:

var age: Int {

didSet {

if age < 18 {</p> print("你还未成年")

}

}

}

在这个例子中,didSet 方法会在属性值被更改之后立即执行。如果新的年龄小于 18,它会打印一条消息告诉用户他们还未成年。

使用 set 和 didSet 的案例

现在我们来看一些实际的案例,以更好地理解 set 和 didSet 的区别。

假设我们有一个名为 temperature 的属性,用于存储温度值。我们希望在设置新的温度值时,确保它在特定范围内,并在温度值被更改后更新用户界面。

var temperature: Double {

set {

if newValue < -273.15 {</p> print("温度不能低于绝对零度")

} else if newValue > 100 {

print("温度不能超过 100 度")

} else {

_temperature = newValue

updateUI()

}

}

get {

return _temperature

}

}

func updateUI() {

// 更新用户界面的代码

}

在上面的代码中,我们使用 set 方法来验证温度值是否在合法范围内。如果温度值小于绝对零度或大于 100 度,它会打印相应的错误消息。否则,它会将新的温度值存储到私有变量 _temperature 中,并调用 updateUI 方法来更新用户界面。

接下来,我们可以使用 didSet 来执行一些额外的操作,例如在温度值被更改后更新显示温度的标签:

var temperature: Double {

didSet {

temperatureLabel.text = "\(temperature) 度"

}

}

@IBOutlet weak var temperatureLabel: UILabel!

在上面的代码中,didSet 方法会在温度值被更改后立即执行。它会将新的温度值转换为字符串,并更新 temperatureLabel 的文本。

在本文中,我们探讨了 set 和 didSet 之间的根本区别。set 在属性值被存储之前执行,而 didSet 在属性值被更改之后立即执行。通过在 set 中验证和修改属性的值,我们可以确保属性值的合法性。通过在 didSet 中执行一些额外的操作,我们可以及时响应属性值的更改并更新用户界面。这些特性使得 set 和 didSet 成为 Swift 语言中非常有用的工具。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号