Swift Day08 属性
2020-12-03 本文已影响0人
望穿秋水小作坊
一、属性
1. Swift 中跟实例相关
的属性
分为哪两类?分别有什么特点(各说三点)?
- 存储属性(Stored Property)
- 类似于成员变量这个概念
- 存储在实例的内存中
- 结构体、类可以定义存储属性
- 枚举
不可以
定义存储属性
- 计算属性(Computed Property)
- 本质就是方法(函数)
- 不占用实例的内存
- 枚举、结构体、类都可以定义计算属性
2. 为什么枚举不能定义存储属性
?
- 因为枚举实例中要么存储原始值,要么存储关联值,没有位置放存储属性。
3. 计算属性的本质是什么?等价于给我们生成哪两个方法?
- 本质就是函数
- 等价于生成了 setXxx() 和 getXxx()
4. 使用汇编观察上面图示中代码的 radius 和 diameter 设置值的时候,分别对应的汇编代码长什么样?
汇编观察- 可以看出:
存储属性
赋值是直接对相应的内存地址
赋值 -
计算属性
赋值,是setter 方法的调用
5. 思考为什么存储属性必须设置一个初始值?
- 这是 swift 对
存储属性
的明确规定 - 因为实例对象的内存里面就是存放着存储属性,本质上 swift 想保证实例对象的内存存的值是明确的
6. 为什么计算属性不能用 let 的修饰,只能用 var?
- 计算属性的值是可能发生变化的,依赖于其他属性计算所得,所以不能 let 修饰
7.学到这里,我们可以想清楚 枚举的 rawValue 到底是怎么办到返回原始值的吗?
只读计算属性8. 延迟存储属性如何定义?有什么特点和注意点?(各说一个)
延迟存储属性9. 什么样的属性可以设置属性观察器
?如何设置属性观察器?
属性观察器
10. inout
对计算属性、观察属性、一般存储属性分别有什么效果?或者说编译器是如何处理的?
inout 本质
11. 什么是类型属性?和存储实例属性对比?如何定义类型属性?
类型属性12. 类型属性的最近使用场景是什么?有什么优点?
-
单例
单例 -
延迟加载
-
线程安全
-
保证永远只有一份
-
不可修改