Swift教程之属性详解

2020-01-08 22:50:59于丽

通过移除get关键字和它的大括号,可以简化只读计算属性的定义:

 

复制代码
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
println("the volume of fourByFiveByTwo is (fourByFiveByTwo.volume)")
// prints "the volume of fourByFiveByTwo is 40.0

 

这个例子定义了一个三维长方体结构Cuboid,包含了长宽高三个属性,和一个表示长方体容积的只读计算属性volume。volume值是不可被设置的,因为它直接由长宽高三个属性计算而来。通过提供这样一个只读计算属性,Cuboid使外部用户能够访问到其当前的容积值。

3、属性观察者

属性观察者观察属性值的改变并对此做出响应。当设置属性的值时,属性观察者就被调用,即使当新值同原值相同时也会被调用。

除了懒惰存储属性,你可以为任何存储属性加上属性观察者定义。另外,通过重写子类属性,也可以继承属性(存储或计算)加上属性观察者定义。属性重写在“重写”章节定义。

注意
不必为未重写的计算属性定义属性观察者,因为可以通过它的setter方法直接对值的改变做出响应

定义属性的观察者时,你可以单独或同时使用下面的方法:
willSet:设置值前被调用
didSet:设置值后立刻被调用

当实现willSet观察者时,新的属性值作为常量参数被传递。你可以为这个参数起一个名字,如果不的话,这个参数就默认地被命名成newValue。

在实现didSet观察者时也是一样,只不过传递的产量参数表示的是旧的属性值。

注意:
属性初始化时,willset和didSet并不会被调用。只有在初始化上下文之外,当设置属性值时才被调用

下面是一个willSet和didSet用法的实例。定义了一个类StepCounter,用来统计人走路时的步数。它可以从计步器或其它计数器上获取输入数据,对日常联系锻炼的步数进行追踪。

 

复制代码
class StepCounter {
var totalSteps: Int = 0 {