[英]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.