欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的一样。