[英]Swift property observer issue
我的财产观察员有问题,想了解更多有关 Swift 行为的信息。
我有以下使用回调的架构:
更高的杠杆等级
class MyFirstClass : NSScrollView {
var colorDidUpdate: (() -> ())?
var color = NSColor.black {
didSet {
colorDidUpdate?()
}
}
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
/* Some init */
var mySecondClass = MySecondClass(frame: frame)
colorDidUpdate = mySecondClass.enclosingViewDidUpdateColor
mySecondClass.color = color
documentView = mySecondClass
/* Some other init */
}
}
然后是第二类,就像第一类和第三类之间的链接
class MySecondClass {
var viewColorDidUpdate: (() -> ())?
var color: NSColor?
var myThirdClass = MyThirdClass(frame: frame)
init(frame frameRect: NSRect) {
/* Some init */
viewColorDidUpdate = myThirdClass.updateColor
myThirdClass.color = color
/* Some other init */
}
func enclosingViewDidUpdateColor() {
viewStyleDidUpdate?()
}
}
最后是第三堂课,抽签结束。
class MyThirdClass {
var color: NSColor?
func draw(_ dirtyRect: NSRect) {
guard let color = color else { return }
// The color is black instead of green.
}
/* proerties and functions... */
func updateColor() {
functionThatWillTriggerTheDrawFunction() // Will trigger draw function
}
}
如果我为 MyClass 属性设置新颜色,例如
var myClass = MyClass()
myClass.color = .green
印刷的颜色不是“绿色”,但它仍然是黑色......
我以为当我们在 didSet 范围内时,变量已经设置了,我错了吗?
我应该使用其他模式吗?
我以为当我们在 didSet 范围内时,变量已经设置了,我错了吗?
不,那是真的,但我猜还有其他事情正在发生(尽管相关代码似乎没有被包含在内)
顾名思义,闭closure
关闭它在定义时使用的变量。 因此,您很可能在颜色仍然为黑色时定义/使用闭包。 您不能使用闭包为您提供捕获的变量的当前值,但您可以将该值作为参数传递给闭包。 我希望这是有道理的。
如果您提供更完整的代码示例,我可以更好地了解您的情况可能存在的问题。
更新(在您提供更多代码之后):
您只是在它们的 init 方法上设置第二个和第三个类的颜色。 当您更新第一类颜色属性时,您永远不会更新它们的颜色属性。
我确信您所提供代码的简化部分是罪魁祸首,但您可能需要考虑一些事情以使事情更容易遵循:
尽量不要单独保存每个组件中的颜色,而是将其作为函数/方法的参数传递。 这使得更容易看到正在发生的事情。 例如,您可以调用更改处理程序colorDidUpdate(to color: NSColor)
并传入新值。 这样,至少你的第二个类不需要存储颜色,而是将它传递给updateColor(_ color: NSColor)
,它可以设置第三个类的颜色属性并触发重绘。
一般来说,我认为将任何更改传递给更改处理程序而不是从全局状态读取它是有益的。 尽量不要存储所有内容,而是传递您需要的信息,而不将其存储在中间(如果可能)。 这样可以更轻松地查看数据和信息在您的应用程序中的流动位置和方式,并可能表明架构存在问题。
建议以不同的方式构建整个事物有点困难,因为这里的代码只是片段,但看起来您可以稍微改进和简化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.