属性
- 存储属性(要么是常量(let修饰)存储属性,要么是变量(var修饰)存储属性)
1 class LGTeacher{
2 let age: Int = 18
3 var name: String = "Kody"
4 }
5 let t = LGTeacher()
对于上面的age,name来说,都是我们的变量存储属性,这点我们在SIL中也可以看到:
- 计算属性(顾名思义计算属性是不占用存储空间的,本质是get/set方法)
- 属性观察者:(willSet,didSet)
延迟存储属性
1 class LGTeacher{
2 lazy var age: Int = 10
3 }
- 用lazy修饰的存储属性
- 延迟存储属性必须有一个默认的初始值
- 延迟存储在第一次访问的时候才被赋值
- 延迟存储属性并不能保证线程安全
- 延迟存储属性对实例对象大小的影响
类型属性
1 class LGTeacher{
2 static var age: Int = 10
3 }
- 使用关键字static修饰
- 类型属性必须有一个默认的初始值
- 类型属性只会被初始化一次
单例的正确写法
1 class LGTeacher{
2 static let sharedInstance: LGTeacher = LGTeacher()
3 private init(){}
4 }
- 使用 static let 创建声明一个实例对象
- 给当前 init 添加访问控制权限 private
结构体的初始化
- 结构体不需要自定义初始化方法,对比下面两段代码
1 //1
2 struct LGTeacher{
3 var age: Int
4 var name: String
5 }
6
7 //2
8 class LGStudent{
9 var age: Int
10 var name: String
11 }
其中第二段代码在编译过程中会报错:"Class 'LGStudent' has no initializers"
这是因为编译器在结构体中自动帮助我们合成了初始化方法,也就以为着我们可以这样调用:
也可以通过SIL来查看:(不知道SIL为何物的同学,可以自己搜索查看)
- 如果我们的属性有默认初始值,系统会提供不同的默认初始化方法
- 如果我们自定义初始化方法,系统就不回帮我们生成初始化方法