2017-01-26 3 views
2

私はここでかなり新しいです。私は迅速にプロパティオブザーバーに質問があります。以下にいくつかのサンプルコードがあります。私が欲しいのは、a.valueが変更された場合、Analysis.hasChangedプロパティをtrueに更新するプロパティです。私はこれを行う方法がありますか?最後にSwift:クラスのプロパティの変更を他のクラスから観察する方法

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" 

、私は、ユーザーが自分の分析のいずれかが、彼らが選択した場合、彼らは分析の結果を更新することができるように変更された番号を使用している場合に通知することができるようにしたいです。

おかげで私を提供することができます任意のヘルプ誰のための束。

-Logan

+0

KVOはクラスがNSObjectから継承されている場合にのみ機能します。 –

+2

"a.valueが変更された場合、SumTwo.hasChangedプロパティをtrueに更新するプロパティが必要です。"しかし、SumTwoはコードのどこにもありません。 – matt

+0

おっと。申し訳ありません。私はこの例を単純化し、最初の段落でクラス名を編集するのを忘れていました。私はそれを修正しました。 – Logan

答えて

2

あなたはスウィフトが提供する組み込みのプロパティのオブザーバーを使用することができます。 新しい値を設定するたびに、didSetが呼び出されます。

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" 
+0

これは素晴らしいです。とても簡単!ここで何が起こっているかを正確に見るためにこれを調べる必要がありますが、それは完全に機能し、それだけです。デニスラバありがとう! – Logan

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()を呼び出す代わりに)いくつかのトリガー方法が必要な場合は、追加の機能があります。

関連する問題