Swift中的计算属性“科普向”
Swift中的计算属性“科普向”

Swift中的计算属性“科普向”

什么是计算属性?

定义:计算属性是不会直接存储值的属性,它的值是通过代码逻辑计算得出的。

特点

计算属性是动态的,每次访问都会执行它的计算逻辑。

它可以是只读属性(只需要 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。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注