2016-11-01 7 views
2

Я занимаюсь этим, и мне было интересно, есть ли какая-либо литература по этому вопросу или какой-либо способ узнать, каково ожидаемое поведение. Вот пример:Смешивание Swift Property Observers и Inheritance

class A { 
var paused:Bool = false { 
    willSet { print("Class A willSet on paused called") } 
    didSet { print("Class A didSet on paused called") } 
    } 
} 

class B : A { 
    override var paused:Bool { 
     willSet { print("Class B willSet on paused called") } 
     didSet { print("Class B didSet on paused called") } 
    } 
} 

class C : B { 
    override var paused:Bool { 
     willSet { print("Class C willSet on paused called") } 
     didSet { print("Class C didSet on paused called") } 
    } 
} 

let testC = C() 
testC.paused = true 

Когда это работает я получаю этот выход:

Class C willSet on paused called Class B willSet on paused called Class A willSet on paused called Class A didSet on paused called Class B didSet on paused called Class C didSet on paused called

Кажется, что willSet называется обычным способом полиморфизма, но didSet называется в обратном направлении. Это классно, но где это поведение задокументировано? Является ли такой тест единственным способом его изучения?

ответ

3

Порядок звонков didSet как ожидается - каждый ребенок называет его willSet, затем называет супер, затем называет его didSet. Если вы сделали это с буквальными вызовами на super.pause, у вас будет что-то вроде этого, что делает порядок звонков didSet ясным:

class A { 
    var paused:Bool = false 

    func pause(_ paused:Bool) { 
     print("Class A will set paused") 
     self.paused=paused 
     print("Class A did set paused") 
    } 
} 

class B : A { 
    override func pause(_ paused:Bool) { 
     print("Class B will set paused") 
     super.pause(paused) 
     print("Class B did set paused") 
    } 
} 

class C : B { 
    override func pause(_ paused:Bool) { 
     print("Class C will set paused") 
     super.pause(paused) 
     print("Class C did set paused") 
    } 
} 

let testC = C() 
testC.pause(true)