1.存储属性
延迟存储属性
延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用 lazy来标示一个延迟存储属性。
class DataManager { lazy var importer = DataImporter()
var data = [String]()
}
注意:如果一个被标记为 lazy的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。
2.计算属性
计算属性不直接存储值,而是提供一个 getter和一个可选的 setter,来间接获取和设置其他属性或变量的值。
如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称 newValue。
只有 getter 没有 setter的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。
var center: Point {
get {
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
}
}
var center: Point {
get {
return Point(x: centerX, y: centerY)
} set {
origin.x = newValue.x - (size.width / 2)
}
}
var center: Point {
get {
return Point(x: centerX, y: centerY)
}
}
3.属性观察器
• willSet在新的值被设置之前调用
• didSet在新的值被设置之后立即调用
willSet观察器会将新的属性值作为常量参数传入,在willSet的实现代码中可以为这个参数指定一个名称,如果不指定则参数仍然可用,这时使用默认名称newValue表示。
didSet观察器会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名oldValue。如果在didSet方法中再次对该属性赋值,那么新值会覆盖旧的值。
4.类型属性
使用关键字 static 来定义类型属性。在为类定义计算型类型属性时,可以改用关键字 class来支持子类对父 类的实现进行重写。
5.可变方法
结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改。如果你确实需要在某个特定的方法中修改结构体或者枚举的属性,你可以为这个方法选择可变(mutating)行为。
6.类型方法
定义在类型本身的方法,这种方法就叫做类型方法。在方法的 func关键字之前加上关键字 static,来指定类型方法。类还可以用关键字 class来允许子类重写 父类的方法实现
7.下标语法
定义下标使用 subscript 关键字,指定一个或多个输入参数 和返回类型;与实例方法不同的是,下标可以设定为读写或只读。这种行为由 getter 和 setter 实现,有点类 似计算型属性:
subscript(index: Int) -> Int {
get {
// 返回一个适当的 Int 类型的值
}
set(newValue) { // 执行适当的赋值操作
}
}