我对财产观察员提出了一个问题。下面是一些示例代码。我想要的是如果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"
最后,我希望用户能够在他们的任何分析使用已更改的数字时收到通知,以便他们可以选择更新分析结果。
答案 0 :(得分:6)
您可以使用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"
答案 1 :(得分:0)
我会做这样的事情,如果我的语法错误,我会事先道歉(我通常使用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()),可能还有其他功能。
答案 2 :(得分:0)
将双精度(和任何其他浮点类型)与'='或'!='进行比较不是一个好主意。
请改用epsilon函数。 详细信息:jessesquires.com/blog/floating-point-swift-ulp-and-epsilon /