Swift 个人学习笔记 - 09: 属性

2017-03-25 22:36

本文章纯粹是中文版《The Swift Programming Language》的学习笔记,所以绝大部分的内容都是文中有的。本文是本人的学习笔记,不是正式系统的记录。仅供参考

以下还是有很多没看懂、不确定的地方,我会以“存疑”的注解指出。

在此感谢中文版翻译者,这极大地加快了 Swift 的学习速度。

本文地址:https://segmentfault.com/a/1190000008649921

Reference:

原版:The Swift Programming Language
中文版:Swift 3 编程语言 - 属性

属性

属性可以分为计算属性和存储属性两种。

  • 计算属性可以由 class, struct, enum 定义

  • 存储属性可以由 class, struct 定义

在类的内部,可以定义属性观察器,实现在属性变化前和变化后做相应的处理。

存储属性

使用 let 或 var 引入。

延迟存储属性

使用 lazy 关键字来修饰变量,则相应的属性在首次使用的时候才会去计算其值。比如说在类里面定义一个 lazy 类成员,那么这个成员直邮在首次访问的时候才会创建相应的实例。

需要注意的是:延迟存储属性本身并不是线程安全的

计算属性

提供一个 getter 和一个可选的 setter 来间接得到和设置相应的属性值。类似于 Objective-C 里面重载 getter 和 setter 的行为。以下是例子:

struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            ...
            return ...
        }
        set (newCenter) {    // 如果不显式指定变量名的话,则默认为 “newValue”
            ...
        }
    }
}

如果只提供了 getter 就表示这是一个只读属性。

属性观察

除了 lazy 属性之外,所有属性都可以观察,主要是 willSet 和 didSet 关键字。

class StepCounter {
    var totalSteps: Int = 0 {
        willSet (newTotalSteps) {    // 同理,默认名为 “newValue”
            ...
        }
        didSet {
            ...        // 这里有一个默认值 “oldValue”,用来标示老值
        }
    }
}

类型属性

这种属性,在所有同一类型的类的所有实例仅有一个拷贝。必须赋予一个默认值,不可以使用 lazy 关键字。使用 static 关键字来标识。