swift和OC很大的一个不同,就是swift并不能和OC一样,直接重写setter和getter,但swift提供了属性监视和计算属性
先说计算属性,swift无法重写getter和setter方法,只能去利用计算属性去操作其他的属性。
如下,now就是一个计算属性,它计算的是nameNow的get和set,而不是和OC一样,直接去重写nameNow的setter和getter
class Person: NSObject {
var nameNow: String?
//计算属性
var now: String? {
set(wakadika) {
self.nameNow = wakadika! + "door"
}
get {
return self.nameNow
}
}
//带监视器的普通属性
var love: NSInteger? {
willSet {
}
didSet {
}
}
}
如果直接去重写nameNow的set和get会怎样?
image答案是,编译器会提示All paths through this function will call itself
导致方法死循环。
所有通过此函数的调用,都会导致调用自身。死循环崩溃。
结论就是:
willSet是值将要改变时触发,存在一个newValue的变量。didSet是值已经改变触发,存在一个oldValue的变量。
willSet、didSet 和 get、set这两套方法只能二选一,全部实现会报错。所以当想要在get方法里要干事时,就只能用get set方法。而且set方法和willset好像是一样的,都有newValue变量。
所以如果你想在set和get里做一些操作,在swift中,得额外声明一个计算属性,重写它的set和get方法, 然后通过调用计算属性,来达到操作原属性的目的,但直接重写原属性的willSet,看起来更方便。
网友评论