繁体   English   中英

物业观察员对物业财产的迅速

[英]Property observer on property of property in swift

标题有点令人困惑,但它几乎说明了一切。 我想在属性的属性上有一个属性观察者:

class A {

    var b: B

    init() {

        b = B()

    }

    func foo() { }

}

class B {

    var c = 0

    fun bar() { }

}

var a = A()

在这个例子来说明我想要的东西,我想在设置abc调用a.foo() 如果我想调用abbar() ,可以通过更改轻松完成

var c = 0

var c = 0 {
    didSet {
        bar()
    }
}

但是,我想要做的事情并没有简单的方法来实施。 这是我能想到的唯一可行方式:

class A {

    var b: B {
        didSet {
            b.a = self
        }
    }

    init() {

        b = B()
        b.a = self

    }

    func foo() { }

}

class B {

    weak var a: A?
    var c = 0 {
        didSet {
            a?.foo()
        }
    }

}

这似乎是一个非常混乱的解决方案,似乎应该有一个更好的解决方案。 谢谢你的帮助。

最干净的解决方案是使A派生自NSObject以便它可以使用Key Value Observing:

class A: NSObject {
    var b: B

    override init() {
        b = B()

        super.init()
        self.addObserver(self, forKeyPath: "b.c", options: [.New], context: nil)
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if keyPath == "b.c" {
            foo()
        }
    }

    func foo() {
        print("b.c. has changed")
    }
}

class B: SKSpriteNode {
    // Remember to mark it dynamic here
    dynamic var c = 0

    func bar() { }
}

var a = A()
a.b.c = 42 // will trigger a.foo()

如果您不想这样,请使用delegate模式:

protocol BDelegate {
    func foo()
}

class A: BDelegate {
    var b: B

    init() {
        b = B()
        b.delegate = self
    }

    func foo() {
        print("b.c. has changed")
    }
}

class B: SKSpriteNode {
    var delegate: BDelegate?

    var c = 0 {
        didSet {                
            delegate?.foo()
        }
    }

    func bar() { }
}

var a = A()
a.b.c = 42 // will trigger a.foo()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM