Swift — 计算属性

基本概念 #

官方文档

在 Swift 中,getset 是用于定义计算属性的访问器。计算属性是一种特殊的属性,它没有直接存储值,而是通过一个方法来计算其值。

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 访问器会被调用,并接收一个新值作为参数。在这个示例中,我们使用新值来更新 widthheight,以确保 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 只能有一个参数,如果内部需要使用多个参数进行计算,可以考虑使用元组或结构体来传递这些值。
本文共 820 字,上次修改于 Dec 16, 2024