2015-10-12 9 views
6

私は1つがセッターであり、もう1つはプロパティオブザーバであることを理解しています。私の質問は、彼らの行動がどのように異なっているのか、そしていつ他のものを使うのかということです。彼らはほとんど同じことをしないのですか?たとえば、setとdidSetの基本的な違いは何ですか?

答えて

9

これらは、まったく同じことをしません。反対に、まったく異なる目的を持っています。 getおよびsetは、計算されたプロパティで使用されます。たとえば、実際には使用されていないが、デモが良いこの構造例を考えてみましょう。だから、

struct test { 
    var x = 5 
    var y = 5 
    var number: Int { 
     get { 
      return x * y 
     } 
     set (newValue){ 
      x = newValue/2 
      y = newValue/2 
     } 
    } 
} 

var s = test() 
s.number //25 
s.number = 100 
s.x //50 
s.number //2500 

、変数numberは、伝統的な意味での変数ではありませんあなたが見ることができるように、それは計算されたプロパティです。だから、s.numberと呼ぶと、xとyの積が得られます。また、このセットを使用して、構造内の他の変数(計算されたプロパティ自体ではない)を変更します。したがって、私はxynewValueに基づいて異なる値に設定しました。計算されたプロパティのこのアイデアは関数の代わりに使用することができ、関数からのデータの取得を簡略化するのに非常に便利です。たとえば、距離をキロメートル単位で持つ構造を持つことができ、マイル単位で非常に頻繁にそれを望むかもしれません。したがって、計算されたプロパティmilesを作成してgetメソッドを使用してキロメートルの数を計算し、プログラムでマイルを設定した場合はセッターとのキロ数を変更することができます。


さて、didSetwillSetため。これらを使用して、構造に値変更を通知することができます。たとえば、averageTrackerです。

struct averageTracker { 
    var total: Double = 0 { 
     didSet { 
      numEntries++ 
     } 
    } 
    var numEntries: Double = 0 
    var average: Double { 
     get { 
      return total/numEntries 
     } 
    } 
} 


var ave = averageTracker() 
ave.total += 10 
ave.total += 20 
ave.average //15 

didSetはつまり、それは計算されたプロパティではありません、値を含む変数に実際にどのように注意してください。また、計算されたプロパティーaverageを使用して平均値を取得しました。全体的に、私はSwiftのこの非常に強力な面に関してあなたの混乱を解消したいと思っています。

関連する問題