Swift Day08 属性

一、属性

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. 类型属性的最佳使用场景是什么?有什么优点?
  • 单例


    单例
  • 延迟加载

  • 线程安全

  • 保证永远只有一份

  • 不可修改

你可能感兴趣的:(Swift Day08 属性)