如何观察一个类的属性与另一个类的变化



我有一个关于属性观察者的问题。下面是一些示例代码。我想要的是,如果更改了 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/

最新更新