属性将值跟特定的类,结构体或枚举关联。
实例属性
1.1 存储属性
struct SomeStruct {
let name = "小宝" //常量存储属性
var age = 6 //变量存储属性
var briday: String? //可选属性
lazy var add = "中国" //惰性属性
}
可选属性通常用在变量中,可选属性的初始值为nil。
如果在属性前面使用了lazy关键字,则表示它只有被用到的时候才会初始化。只有var定义的属性才能用lazy关键字。这个特性通
常被用来处理一些复杂的初始化依赖,解决卡顿问题。
存储属性只能用于类和结构体里。
1.2 计算属性
计算属性不直接存储值,而是提供一个getter来获取值,然后用一个可选的setter来间接设置其他属性或变量的值。
struct Player {
var firstName = "勒布朗"
var sendName = "詹姆斯"
var fullName: String {
get {
return firstName + sendName
}
}
}
let play23 = Player()
play23.fullName
计算属性在构造方法完成后并没有初始化
如果没有setter 方法 可以省略 get
系统在保存某个数据结构的时候,只保存它里面的存储属性,计算属性和方法一样,是被集中管理的。
计算属性类似于方法。
计算属性中的get 方法通过访问触发,set方法通过赋值触发。
1.3 属性观察器
属性观察器可以用来检测属性值的变化,格式如下:
var exampleOfProperty: Int = 10 {
willSet {
//在属性值更改之前dosome
//willSet中有一个特殊的变量newValue,代表属性将要被赋予的新值
}
didSet {
//在属性值更改之后dosome
//didSet中有一个特殊的变量oldValue,代表属性被设置之前的旧值
}
}
需要注意的是,属性观察器更适合值类型,属性观察器实际监听的是“栈”上所发生的改变。
类型属性
类型属性用于定义特定类型所有实例共享的数据。使用关键字static来定义类型属性,类型属性可以包括存储属性和计算属性,另
外在类中有一个专用的关键字 class,用来定义可以被子类重写的计算属性。static == final class
struct NewStrut {
static var storedTypeProperty = ""
static var computedTypeProperty: Int {
return 1
}
}
class NewClass {
static var storedTypeProperty = ""
final class var computedTypeProperty: Int {
return 1
}
class var overrideableComputedTypeProperty: Int {
get {
return 10
}
}
}
class NewerClass:NewClass {
override class var overrideableComputedTypeProperty: Int {
return 100
}
}
print(NewerClass.overrideableComputedTypeProperty)
注意,要通过类型本身来获取类型属性。