簡體   English   中英

如何從另一個類中觀察類屬性的變化

[英]How to observe a change in a class's property from another class

我有一個關於財產觀察員的問題。 下面是一些示例代碼。 我想要的是如果a.value被更改,屬性Analysis.hasChanged將更新為true。 有沒有辦法可以做到這一點?

class Number {
 var value: Double
 init(numberValue: Double) {
  self.value = NumberValue
 }
}

class Analysis {
 var a: Number
 var hasChanged = false
 init(inputNumber: Number) {
  self.a = inputNumber
 }
}

testNumber = Number(numberValue: 4)
testAnalysis = Analysis(inputNumber: testNumber)
print(testAnalysis.hasChanged) // will print "false"
testNumber.value = 10
print(testAnalysis.hasChanged) // will still print "false", but I want it to print "true"

最后,我希望用戶能夠在他們的任何分析使用已更改的數字時收到通知,以便他們可以在選擇時更新分析結果。

您可以使用Swift提供的內置屬性觀察器。 每次設置新值時,都會調用didSet。 您只需要將包含所需行為的閉包附加到Number類

class Number {

    var valueDidChangeClosure: (()->())?
    var value: Double {
        didSet {

            //won't call the valueDidChangeClosure 
            //if the value was changed from 10 to 10 for example.. 

            if oldValue != value {
                valueDidChangeClosure?()
            }  
        }
    }
    init(numberValue: Double) {
        self.value = numberValue
    }
}

class Analysis {
    var a: Number
    var hasChanged = false
    init(inputNumber: Number) {
        self.a = inputNumber
        self.a.valueDidChangeClosure = {
            self.hasChanged = true
        }
    }
}

let testNumber = Number(numberValue: 4)
let testAnalysis = Analysis(inputNumber: testNumber)

print(testAnalysis.hasChanged) // will print "false"
testNumber.value = 10
print(testAnalysis.hasChanged) // will print "true"

我會做這樣的事情,如果我有一些語法錯誤,我會提前道歉(我通常使用C / C ++,認為這是更多的psudo代碼,因為你必須有一種方法來復制Number類等)。

class Number {
 var value: Double
 init(numberValue: Double) {
  self.value = NumberValue
 }
}

class Analysis {
 var a: Number
 var _a: Number
 bool hasChanged() {
   if (a != _a) {
      _a = a
      return true;
   }
   return false;
 }
 init(inputNumber: Number) {
  self.a = inputNumber
  self._a = self.a
 }
}

testNumber = Number(numberValue: 4)
testAnalysis = Analysis(inputNumber: testNumber)
print(testAnalysis.hasChanged()) // will print "false"
testNumber.value = 10
print(testAnalysis.hasChanged()) // will still print "false", but I want it to print "true"

最后,我希望用戶能夠在他們的任何分析使用已更改的數字時收到通知,以便他們可以在選擇時更新分析結果。

我不知道這是否真的解決了這個問題,我的回答是基於你提供的代碼。 因此,如果您希望有一些觸發方法(而不是調用.hasChanged()),可能還有其他功能。

將雙精度(和任何其他浮點類型)與'='或'!='進行比較並不是一個好主意。

請改用epsilon函數。 詳情:jessesquires.com/blog/floating-point-swift-ulp-and-epsilon/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM