web-dev-qa-db-ja.com

swift willSet didSet and get set method in a property

プロパティ内でこれを操作する場合、willSet-didSetget-setの違いは何ですか?

私の観点からは、どちらもプロパティの値を設定できます。いつ、そしてなぜ、willSet-didSetを使用すべきか、そしてget-setを使用すべきか?

willSetおよびdidSetの場合、構造は次のようになります。

var variable1 : Int = 0 {
    didSet {
        println (variable1)
    }
    willSet(newValue) {
    ..
    }
}

var variable2: Int {
    get {
        return variable2
    }
    set (newValue){
    }
}
44
just ME

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'
45
Maxim Shoustin

@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のようなメッセージで警告します。

23
Antonio

get set

getset計算プロパティ実際に値を保存しない。代わりに、他のプロパティと値を間接的に取得および設定するゲッターとオプションのセッターを提供します

さらに、読み取り専用の計算プロパティを定義できます。読み取り専用の計算プロパティは常に値を返し、ドット構文を介してアクセスできますが、別の値に設定することはできません

プロパティのみを取得する例

 var number: Double {
        return .pi*2
    }

willSet didSet

willSetdidSet areProperty Observers

プロパティオブザーバーは、プロパティの値の変化を観察して対応します。プロパティオブザーバーは、新しい値がプロパティの現在の値と同じであっても、プロパティの値が設定されるたびに呼び出されます。

  • willSetは、値が保存される直前に呼び出されます。
  • didSetは、新しい値が保存された直後に呼び出されます。

例-

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

https://developer.Apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

2
Jack
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はすぐに呼び出されますafter新しい値が保存されます。


「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
1
NiravS