Swift属性分为存储属性,计算属性。或者分为实例属性,类属性。计算属性不存储值(像是一个计算方法),枚举没有存储属性
存储属性
存在于特定类或结构体实例(或者类和结构体中static修饰)中的一个值,可以是变量,也可以是常量,也可以有默认值,也可以没有
存储属性在构造完成后必须有值(除了可选类型),常量存储属性只能赋一次值
Swift中的属性就是属性(命名,类型,内存管理),没有对应的实例变量,没有后端存储
延迟存储属性
第一次使用的时候才去计算初始值,使用lazy
关键字,而且一定是变量
class A {
lazy var a = 1//内部采用可选类型实现
}
var a = A()//a.a为nil
print(a.a)//a.a为1
计算属性
类,结构体,枚举都可以定义计算属性。计算属性不存储值,提供一个必选getter
和一个可选setter
,来间接获取变量值,或者设置其他值,计算属性必须使用 var
定义
class A {
var a: Int {
get {
return self.a //死循环
}
set {
self.a = newValue //死循环
}
}
}
newValue为默认参数名
,通过set(hhd){}
,重新命名参数名,hhd
为新参数名
class A {
var a: Int {
get {
return 1
}
set(hhd){
print(hhd)
}
}
}
var a = A()
a.a = 100
print(a.a)
只读计算属性
只有getter
没有setter
class A {
var a: Int {
return 1//可以省略get
}
}
属性观察器
值变化的时候可以监控,新值和当前值不同也会监控
延迟属性没有观察器,计算属性自带观察器
通过重写为继承的属性(计算,存储)添加观察器
-
willSet
设置新值前调用 -
didSet
设置新值后调用
class A {
var a = 2{
willSet{
print("willSet newValue \(newValue)")//newValue是个常量
}
didSet{
print("didSet oldValue \(oldValue)")//oldValue也是常量,可以对a再次赋值,这时不会触发观察器
}
}
}
自定义参数名
class A {
var a = 2{
willSet(x){
print("willSet newValue \(x)")
}
didSet(y){
print("didSet oldValue \(y)")
}
}
}
属性作为in-out
参数传入函数,也会触发观察器
父类的属性在子类的构造器中被赋值时,它在父类中的 willSet
和 didSet 观察器会被调用,随后才会调用子类的观察器。在父类初始化方法调用之前,子类 给属性赋值时,观察器不会被调用 //不知道这句话到底什么意思”
全局变量和局部变量
全局:在函数、方法、闭包和任何类型之外定义
局部:函数、方法、闭包内定义
还可以分为 存储型变量 计算型变量 还可以定义属性观察器
全局的常量变量都是延迟计算,但是不需要lazy
修饰
局部的不延迟
类型属性
就是属于类型的属性,所有实例共享
存储型类型属性可以是常量或变量,计算型类型属性只能是变量
存储型类型属性必须要有默认值,因为类中没有关于类的构造函数,存储型类型属性是延迟计算,不用 lazy
类型属性语法
使用关键字static
,计算型类型属性,可以改用class
来支持子类对父类的实现进行重写
获取和设置类型属性的值
通过类名访问,不能通过实例访问