Swift进阶杂谈1:属性

650 阅读2分钟

属性

  • 存储属性(要么是常量(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为何物的同学,可以自己搜索查看)

  • 如果我们的属性有默认初始值,系统会提供不同的默认初始化方法

  • 如果我们自定义初始化方法,系统就不回帮我们生成初始化方法