[英]Property observer on property of property in swift
The title is a bit confusing, but it pretty much says it all. 标题有点令人困惑,但它几乎说明了一切。 I want to have a property observer on a property of a property: 我想在属性的属性上有一个属性观察者:
class A {
var b: B
init() {
b = B()
}
func foo() { }
}
class B {
var c = 0
fun bar() { }
}
var a = A()
In this example to illustrate what I want, I want a.foo()
to be called whenever abc
is set. 在这个例子来说明我想要的东西,我想在设置abc
调用a.foo()
。 If I wanted to call abbar()
instead, this could easily be done by changing 如果我想调用abbar()
,可以通过更改轻松完成
var c = 0
to 至
var c = 0 {
didSet {
bar()
}
}
However, what I want to be done has no easy way to be implemented. 但是,我想要做的事情并没有简单的方法来实施。 This is the only way of getting to behave as I want that I can think of: 这是我能想到的唯一可行方式:
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()
}
}
}
This just seems like a very messy solution that seems like it should have a better one. 这似乎是一个非常混乱的解决方案,似乎应该有一个更好的解决方案。 Thanks for any help. 谢谢你的帮助。
The cleanest solution is to make A
derive from NSObject
so it can use Key Value Observing: 最干净的解决方案是使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()
If you don't want that, use the delegate
pattern: 如果您不想这样,请使用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.