swift学习之旅--set和get的重写

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,看起来更方便。

你可能感兴趣的:(swift学习之旅--set和get的重写)