プロパティ内でこれを操作する場合、willSet
-didSet
とget
-set
の違いは何ですか?
私の観点からは、どちらもプロパティの値を設定できます。いつ、そしてなぜ、willSet
-didSet
を使用すべきか、そしてget
-set
を使用すべきか?
willSet
およびdidSet
の場合、構造は次のようになります。
var variable1 : Int = 0 {
didSet {
println (variable1)
}
willSet(newValue) {
..
}
}
var variable2: Int {
get {
return variable2
}
set (newValue){
}
}
WillSet/didSetを使用するタイミングと理由
willSet
は単にbeforeと呼ばれ、値が保存されます。didSet
がすぐに呼び出されますafter新しい値が保存されます。出力を使用した例を考えてみましょう。
var variable1 : Int = 0 {
didSet{
print("didSet called")
}
willSet(newValue){
print("willSet called")
}
}
print("we are going to add 3")
variable1 = 3
print("we added 3")
出力:
we are going to add 3
willSet called
didSet called
we added 3
事前/事後条件のように機能します
一方、たとえば読み取り専用プロパティを追加する場合は、get
を使用できます。
var value : Int {
get {
return 34
}
}
print(value)
value = 2 // error: cannot assign to a get-only property 'value'
@Maximの答えは、あなたの質問の最初の部分です。
get
およびset
を使用する場合:計算されたプロパティが必要な場合。この:
var x: Int
stored propertyを作成します。これは変数によって自動的にバックアップされます(ただし、直接アクセスできません)。そのプロパティに値を設定すると、プロパティに値を設定する際に変換され、取得する場合も同様です。
代わりに:
var y = {
get { return x + 5 }
set { x = newValue - 5}
}
変数によってバックアップされない計算されたプロパティを作成します-代わりにゲッターやセッターの実装を提供する必要があり、通常は別のプロパティから、より一般的には計算の結果として値を読み書きします(したがって計算されたプロパティ名)
推奨読書: プロパティ
注:コード:
var variable2: Int {
get{
return variable2
}
set (newValue){
}
}
は、wrongです。なぜならget
で自分自身を返そうとしているからです。つまり、get
を再帰的に呼び出すことを意味します。そして実際、コンパイラーはAttempting to access 'variable2' within its own getter
のようなメッセージで警告します。
get set:
get
set
は計算プロパティ実際に値を保存しない。代わりに、他のプロパティと値を間接的に取得および設定するゲッターとオプションのセッターを提供します
さらに、読み取り専用の計算プロパティを定義できます。読み取り専用の計算プロパティは常に値を返し、ドット構文を介してアクセスできますが、別の値に設定することはできません
プロパティのみを取得する例
var number: Double {
return .pi*2
}
willSet didSet:
willSet
didSet
areProperty Observersプロパティオブザーバーは、プロパティの値の変化を観察して対応します。プロパティオブザーバーは、新しい値がプロパティの現在の値と同じであっても、プロパティの値が設定されるたびに呼び出されます。
例-
var score: Int = 0 {
willSet(newScore) {
print("willSet score to \(newScore)")
}
didSet {
print("didSet score to \(oldValue) new score is: \(score)")
}
}
score = 10
//Output
//willSet score to 10
//didSet score to 0 new score is: 10
var variable1 : Int = 0 { //It's a store property
didSet {
print (variable1)
}
willSet(newValue) {
..
}
}
var variable2: Int { //It's a Computed Proprties
get {
return variable2
}
set (newValue){
}
}
ストアプロパティと計算プロパティ の詳細情報
したがって、その割り当て時に変数に値を割り当てようとすると、「didSet」と「willSet」の概念が現れます。 @Maximが言うように
「willSet」および「didSet」の例:
class Number {
var variable1 : Int = 0 {
didSet{
print("didSet called")
}
willSet(newValue){
print("willSet called")
}
}
}
print("we are going to add 3")
Number().variable1 = 3
print("we added 3")
// o/p:
3を追加します
willSetが呼び出されました
didSetが呼び出されました
3を追加しました
一般的に、その時点で2つのプロパティが依存している場合、「get」と「set」が使用されます。 (これは protocol でも使用されます。これは異なる概念です。)
「get」および「set」の例:
class EquilateralTriangle{
var sideLength: Double = 0.0
init(sideLength: Double){
self.sideLength = sideLength
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
}
var triangle = EquilateralTriangle(sideLength: 3.0)
print(triangle.perimeter) //o/p: 9.0
triangle.perimeter = 12.0
print(triangle.sideLength) //o/p: 4.0