Swift基础 属性

计算属性

计算属性不直接储存,而是提供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的一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值