定义
Swift中跟实例相关的属性可以 分为2大类,存储属性和计算属性
demo
存储属性
- 类似于成员变量这个概念
- 存储在实例的内存中
- 结构体、类可以定义存储属性
- 枚举
不可以
定义存储属性
存储属性初始值
- 在创建类或结构体的实例是,必须为所有的存储属性设置一个合适的初始值
- 可以在初始化器里为存储属性设置一个初始值
- 可以分配一个默认的属性值作为属性定义的一部分
2
3
计算属性
- 本质就是方法(函数)
- 不占用实例的内存
- 枚举、结构体、类都可以定义计算属性(因为他们都能定义方法)
计算属性初始值
- set传入的新值默认叫做newValue,也可以自定义
- 只读计算属性:只有get没有set (不能只有set,编译器会报错)
- 定义计算属性只能用var不能使用let
- 计算属性的值是可能发生变化的(即使是只读计算属性)
自定义默认
只有get
枚举值rawValue原理
- 枚举值原始值rawValue的本质是:只读计算属性
枚举
延迟存储属性
- 使用lazy可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化
- lazy属性必须是
var
不能是let
(因为let要求初始化必须有值,所以不能与lazy一起使用)
延迟
延迟存储属性的注意点
- 如果多线程同时第一访问lazy属性
- 无法保证属性只能被初始化一次
- 能够使一些不需要第一时间加载的,在需要的时间再去调用
- 当结构体包含一个延迟存储属性时,只要var才能访问延迟属性
- 因为延迟属性初始化时需要改变结构体的内存,
// p.z调用的时候,去初始化z,去改变结构体的内存,但是p是let,是不允许的,若是为var ,则是可以修改。
注意点
属性观察器
- 可以为非
lazy
的var``存储属性
设置属性观察器 -
willSet
会传递新值,默认叫newValue -
didSet
会传递旧值,默认叫oldValue - 在初始化器中设置属性值不会触发
willSet
和didSet
- 在属性定义时设置属性值不会触发
willSet
和didSet
image.png
- 属性观察器、计算属性的功能,同样可以应用在全局变量、局部变量
Demo