gpt4 book ai didi

swift - Property Observer swift 了解属性(property)的属性(property)

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:49 31 4
gpt4 key购买 nike

标题有点乱,但已经说明了一切。我想在一个属性的属性上有一个属性观察器:

class A {

var b: B

init() {

b = B()

}

func foo() { }

}

class B {

var c = 0

fun bar() { }

}

var a = A()

在这个例子中,为了说明我想要什么,我希望在设置 a.b.c 时调用 a.foo()。如果我想改为调用 a.b.bar(),这可以通过更改

轻松完成
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,以便它可以使用键值观察:

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()

关于swift - Property Observer swift 了解属性(property)的属性(property),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342096/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com