web-dev-qa-db-ja.com

計算されたプロパティとクロージャー付きのプロパティセットの違い

私はSwiftが初めてです。計算されたプロパティとクロージャーに設定されたプロパティの違いは何ですか?計算されたプロパティが毎回再計算されることを知っています。閉鎖については違いますか?つまり.

クロージャ:

var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

計算済み:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}
56
bakalolo

1つ目は、クロージャを介して初期化されるストアドプロパティです。 2番目は計算されたプロパティです。

保存されたプロパティの初期化クロージャは一度だけ呼び出されますが、保存されたプロパティの値は後で変更できます(varletに置き換えない限り)。これは、コードをカプセル化して、格納されたプロパティを単一の簡潔なコードブロックで初期化する場合に便利です。

ただし、計算されたプロパティのブロックは、変数を参照するたびに呼び出されます。計算されたプロパティを参照するたびにコードを呼び出す場合に便利です。通常、これは、保存されたプロパティを参照するたびに計算されたプロパティを再計算する必要があるときに行います(たとえば、他の、おそらくプライベートな、保存されたプロパティから再計算されます)。

この場合、計算されたプロパティ(2番目の例)ではなく、保存されたプロパティ(最初の例)が間違いなく必要です。おそらく、変数を参照するたびに新しいPush動作オブジェクトが必要になることはないでしょう。


ちなみに、最初の例では、遅延的にインスタンス化されていることを内部的に参照しています。その動作が必要な場合は、lazyキーワードを使用する必要があります。

lazy var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

ただし、プロパティがstaticである場合、自動的に遅延インスタンス化されます。

95
Rob

主な違いは、セッターがないため、計算されたプロパティに何かを割り当てることができないことです。この場合、クロージャーは1回だけ呼び出され、戻り値は変数に格納されるため、結果が時間とともに変化しない場合は、計算された変数ではなく、格納された変数を使用する方が効率的です。

一般的に、計算されたプロパティは、値をすばやく取得できる場合にのみ使用する必要があります。

補足:格納された変数を変更/再割り当てしない場合は、定数(let)にすることを検討してください。

5
Qbyte

閉鎖:

  //closure
    var pushBehavior: UIPushBehavior = {
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }()

初めてpushBehavior変数が呼び出されると、ブロックが実行され、値がpushBehavior変数に保存されます。その後、pushBehaviorを呼び出すと、それらの値が返されます。

は、この変数で実行および保存された初回ブロックコードのみを意味します。また、いつでも変数値を保存できますが、その後、それらの値が返されますが、「let」として宣言した場合、この値を変更することはできません。

計算プロパティ:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

PushBehavior変数を呼び出すたびに計算されたプロパティで、このブロックが実行され、値が返されます。毎回ブロックが実行されます。また、変数をpushBehavior変数の「let」キーワードとして宣言することはできません。

したがって、要件に応じてこのコードを使用できます。

5
vikas prajapati

これは答えではありませんが、次のことについて言及するだけの価値があります。

  • 値が既知でなければならないストアドプロパティafter初期化。これは、デフォルト設定または初期化によって発生します。
  • 計算されたプロパティの値は、アクセスされるまで計算されません
  • 遅延読み込みされたプロパティの値は、アクセスされるまで定義されません

したがって、計算された変数と遅延変数の両方で、心配なくselfまたは保存されたプロパティにアクセスできます。

1
Honey