计算型属性
特征:本质是方法/函数,不占用实例内存,不直接存储值,本身只起计算作用,仅有get(readOnly语义)或有get+set的属性是计算型属性,有get+set的属性仅作为其他属性的外部接口
get+set为计算型属性的原因:真正赋值的过程是存在于set方法中并被底层包装掉的,如果我们手动实现了set方法,就无法进行正确的赋值
1.计算属性可以用于类、结构体和枚举
2.计算属性只能(用关键字 var 定义)。
3.计算属性不直接存储值,而是提供一个 getter 和一个可选的setter,来间接获取和设置其他属性或变量的值
存储属性
特征:把常量或变量的值作为实例的一部分,可以直接读写赋值。
1.存储属性只能用于类和结构体**
2.存储属性可以是变量存储属性(用关键字 var 定义),也可以是常量存储属性(用关键字 let 定义)
上类代码:
class User: NSObject {
//计算属性
var hob: String{// ------------1
return "hob"
}
var address222: String{// ------------2
return self.address111
// return address111
}
var address333: String{// ------------3
get{
return self.address111
}
}
var address444: String{// ------------4
get{
return self.address111
}
set(newAddress){// ------------5
self.address111 = newAddress
}
}
var address555: String{// ------------6
get{
return self.address111
}
set{
self.address111 = "新地址"
}
}
//存储属性
private var name: String?// ------------7
private var address111: String = "地址111"// ------------8
var age:Int = {// ------------9
return 5
}()
override init() {
}
}
然后分别做几个测试,研究一下打印结果,为了方便理解,这里我就直接把打印结果写在每行代码后面
let user = User()
print(user.address222)//----地址111 a
print(user.address333)//----地址111 b
print(user.address444)//----地址111 c
user.address444 = "jsc搬到了乡下"
print(user.address444)//----jsc搬到了乡下 d
print(user.address222)//----jsc搬到了乡下 e
user.address555 = "jsc搬到了城里"
print(user.address555)//----新地址 f
print(user.address222)//----新地址 g
分析可得以下结论:
1.分析a、b、c处的打印可知道,类中3是2的完整版,2中省去了get方法
2.分析d、e处的打印,可知道,类是引用类型,可以通过类计算属性的set方法给类的私有变量进行修改
3.分析f打印可知道,类中可读可写的计算属性,set必须要有参数才可以复制
属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外。
可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重载属性的方式为继承的属性(包括存储属性和计算属性)添加属性观察器。
ps:不需要为无法重载的计算属性添加属性观察器,因为可以通过 setter 直接监控和响应值的变化。
可以为属性添加如下的一个或全部观察器:
1.willSet在设置新的值之前调用
2.didSet在新的值被设置之后立即调用
3.willSet和didSet观察器在属性初始化过程中不会被调用
eg:
class Samplepgm {
var counter: Int = 0{
willSet(newTotal){
print("计数器: \(newTotal)")
}
didSet{
if counter > oldValue {
print("新增数 \(counter - oldValue)")
}
}
}
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800
网友评论