-
存储属性
- 当值类型的实例被声明为常量的时候,它的所有属性也就成了常量; 把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属性。
- 在属性声明前使用
lazy
来标示一个延迟存储属性,延迟属性必须声明成变量。 - 如果一个被标记为
lazy
的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。 - swift中的属性没有对应的实例变量,属性的后端存储也无法直接访问。
-
计算属性
- 类、结构体和枚举可以定义计算属性。计算属性不直接存储值,而是提供一个
getter
和一个可选的setter
,来间接获取和设置其他属性或变量的值。 - 如果计算属性的
setter
没有定义表示新值的参数名,则可以使用默认名称newValue
。 - 只有
getter
没有setter
的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。 - 必须使用
var
关键字定义计算属性,包括只读计算属性,因为他们的值不是固定的。let
关键字只用来声明常量属性,表示初始化后再也无法修改的值。
- 类、结构体和枚举可以定义计算属性。计算属性不直接存储值,而是提供一个
-
属性观察器
- 监控和响应属性值的变化
-
willSet
- 在新的值被设置之前调用
- 可以为参数指定一个名称,如果不指定则使用默认名称
newValue
表示
-
didSet
- 在新的值被设置之后立即调用
- 可以为参数命名或者使用默认参数名
oldValue
- 如果将属性通过
in-out
方式传入函数,willSet
和didSet
也会调用。这是因为in-out
参数采用了拷入拷出模式:即在函数内部使用的是参数的copy
,函数结束后,又对参数重新赋值。
-
全局变量和局部变量
- 全局的常量或变量都是延迟计算的,跟延迟存储属性不同的地方在于,全局的常量或变量不需要标记
lazy
修饰符。 - 局部范围的常量或变量从不延迟计算。
- 全局的常量或变量都是延迟计算的,跟延迟存储属性不同的地方在于,全局的常量或变量不需要标记
-
类型属性
- 在swift中,类型属性是作为类型定义的一部分写在类型最外层的花括号内,因此它的作用范围也就是类型支持的范围内。
- 使用关键字
static
来定义类型属性。 - 类型属性是通过类型本身来访问,而不是通过实例。
结构体和枚举能够定义方法是Swift与C/OC的主要区别之一。
-
实例方法
- 使用self属性来区分参数名称和属性名称。
- 要使用可变方法,将关键字
mutating
放到方法的func
关键字之前就可以了。
-
类型方法
- 实例方法是被某个类型的实例调用的方法。而在类型本身上调用的方法就叫类型方法。
- 在方法的
func
关键字之前加上关键字static
来指定类型方法。