Swift基础 属性
程序员文章站
2022-05-17 19:55:01
...
计算属性
计算属性不直接储存,而是提供get和set函数访问值
struct Circle {
var radius: Float
var area: Float {
get {
return 3.14 * radius * radius
}
set(newArea) {
radius = newArea / 3.14
radius = sqrtf(radius)
}
}
}
var circle = Circle(radius: 3.0)
var area = circle.area // 提供的半径为3,算出面积为28.26
circle.area = 50.24
var radius = circle.radius // 提供的面积为50.24,算出半径为4
我们还可以简化set
struct Circle {
var radius: Float
var area: Float {
get {
return 3.14 * radius * radius
}
set { // set默认参数为newValue
radius = newValue / 3.14
radius = sqrtf(radius)
}
}
}
只读属性
只有get,没有set的计算属性称为只读属性
struct Circle {
var radius: Float
var area: Float {
get {
return 3.14 * radius * radius
}
}
}
var circle = Circle(radius: 3.0)
var area = circle.area // 提供的半径为3,算出面积为28.26
circle.area = 50.24 // 编译器报错,因为没有set,属于只读属性
属性观察器
Swift还能监测属性的变化,当属性值发生变化时,会出发willSet和didSet
struct StepCounter {
var step: Int {
willSet(newStep) {
print("new step is \(newStep)")
}
didSet(oldStep) {
if step > oldStep {
print("add \(step - oldStep) step")
}
}
}
}
var stepCounter = StepCounter(step: 0)
stepCounter.step = 10
stepCounter.step = 25
打印结果
new step is 10
add 10 step
new step is 25
add 15 step
可见初始化值时并不会触发willSet和didSet。同样可以简化,方式同计算属性(willSet的默认参数为newValue,didSet默认参数为oldValue)。
类型属性
struct StepCounter {
static var step: Int = 0
}
StepCounter.step = 10
print("step countor step is \(StepCounter.step)")
在声明属性时,加上“static”关键字,就是类型属性了,和Java的一样。