什么是计算属性?
定义:计算属性是不会直接存储值的属性,它的值是通过代码逻辑计算得出的。
特点:
计算属性是动态的,每次访问都会执行它的计算逻辑。
它可以是只读属性(只需要 get),也可以是读写属性(需要 get 和 set)。
计算属性的语法
只读计算属性
只需要提供 get,可以省略 get 关键字。
struct Circle {
var radius: Double
var area: Double { // 只读计算属性
return .pi * radius * radius
}
}
let circle = Circle(radius: 5)
print(circle.area) // 输出:78.53981633974483
上面代码中:
area 没有直接存储值。
每次访问 area 时,都会重新计算它的值。
读写计算属性
如果计算属性需要支持赋值(写操作),可以使用 get 和 set。
struct Rectangle {
var width: Double
var height: Double
var perimeter: Double {
get {
return 2 * (width + height)
}
set {
width = newValue / 4
height = newValue / 4
}
}
}
var rectangle = Rectangle(width: 5, height: 10)
print(rectangle.perimeter) // 输出:30.0
rectangle.perimeter = 40
print(rectangle.width) // 输出:10.0
print(rectangle.height) // 输出:10.0
上面代码中:
perimeter 是一个读写计算属性。
get 用于计算周长。
set 允许通过赋值的方式反向调整 width 和 height。
为什么用计算属性?
1、动态生成值:当属性的值是其他属性的计算结果时,计算属性是非常有用的。例如面积、周长等。
2、避免存储冗余:不需要存储中间值,可以直接通过逻辑计算获得所需值。
3、增强代码简洁性和可读性:用属性的方式调用,而不是显式调用函数。
代码示例
在《Swift Map用Picker切换地图样式》一文中,通过判断self返回一个MapStyle类型的值的mapStyle,就是一个计算属性:
var mapStyle: MapStyle {
switch self {
case .standard: return .standard
case .imagery: return .imagery
case .hybrid: return .hybrid
}
}
1、mapStyle 不存储任何值。
2、每次访问 mapStyle 时:根据当前的枚举值(self),通过 switch 返回对应的 MapStyle。
3、它是一个 只读计算属性,因为只有 get 方法,没有 set 方法。
let style = CustomMapStyle.standard
print(style.mapStyle) // 输出:MapStyle.standard
注意:mapStyle返回MapStyle类型的值的原因wei ,mapStyle返回值的声明是MapStyle,所以当 return .standards ,表示MapStyle.standard。
总结
计算属性不存储值,值是动态计算出来的。
通过 get 定义读取逻辑,set 定义写入逻辑。
CustomMapStyle 的 mapStyle 属性是一个典型的只读计算属性,动态映射枚举值到对应的 MapStyle。