基本概念 #
在 Swift 中,get
和 set
是用于定义计算属性的访问器。计算属性是一种特殊的属性,它没有直接存储值,而是通过一个方法来计算其值。
get
访问器:
- 用于获取计算属性的值。
- 当你访问计算属性时,
get
访问器会被调用。 get
访问器必须返回一个与属性类型匹配的值。
set
访问器:
- 用于设置计算属性的值。
- 当你给计算属性赋值时,
set
访问器会被调用。 set
访问器接收一个新值作为参数,并将其用于更新计算属性的内部状态。
示例:
class Rectangle {
var width: Double
var height: Double
var area: Double {
get {
return width * height
}
set {
width = sqrt(newValue)
height = sqrt(newValue)
}
}
init(width: Double, height: Double) {
self.width = width
self.height = height
}
}
let rectangle = Rectangle(width: 4.0, height: 3.0)
print(rectangle.area) // 输出:12.0
rectangle.area = 25.0 // 设置 area 为 25.0
print(rectangle.width) // 输出:5.0
print(rectangle.height) // 输出:5.0
在这个示例中,area
是一个计算属性,它没有直接存储值,而是通过 get
访问器来计算其值。当我们访问 rectangle.area
时,get
访问器会被调用,并返回 width * height
的结果。
set
访问器用于设置 area
的值。当我们给 rectangle.area
赋值时,set
访问器会被调用,并接收一个新值作为参数。在这个示例中,我们使用新值来更新 width
和 height
,以确保 area
的值始终等于 width * height
。
默认情况 #
- 你可以省略
get
访问器的关键字,因为它默认存在。 set
访问器必须有一个名为newValue
的参数,用于接收新值。- 计算属性不能直接存储值,它们的值始终是通过
get
访问器计算出来的。
你还可以为 set
访问器中的参数选择其他名称,但需要遵循以下步骤:
示例:
class Circle {
var radius: Double
var area: Double {
get {
return Double.pi * radius * radius
}
set(newAreaValue) { // 使用 newAreaValue 作为参数名
radius = sqrt(newAreaValue / Double.pi) // 使用 newAreaValue 访问参数值
}
}
init(radius: Double) {
self.radius = radius
}
}
let circle = Circle(radius: 2.0)
circle.area = 12.56 // 设置 area 为 12.56
print(circle.radius) // 输出:2.0
在这个例子中,我们使用 newAreaValue
作为 set
访问器中的参数名,并在访问器内部使用它来计算新的 radius
值。
注意:
- 虽然你可以使用其他参数名,但
newValue
是最常用的,因为它清晰地表明了这个参数代表的是要设置的新值。 - 如果你选择使用其他参数名,请确保它易于理解和维护。
- 如果你没有自定义参数名,Swift 会自动使用
newValue
作为参数名。 setter
只能有一个参数,如果内部需要使用多个参数进行计算,可以考虑使用元组或结构体来传递这些值。