3

我一直在修改这个,我想知道是否有任何关于这个主题的文献,或者任何知道预期行为的方式。这是一个例子:

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反向调用了。这有点酷,但是这种行为记录在哪里?像这样的测试是学习它的唯一方法吗?

4

1 回答 1

4

调用的顺序与didSet预期一致——每个孩子调用 it's willSet,然后调用 super ,然后调用 it's 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)
于 2016-11-01T15:44:09.513 回答