1. ホーム
  2. swift

計算資産とクロージャ付き資産集合の違い

2023-08-03 10:18:55

質問

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
    }
}

どのように解決するのですか?

簡単に言うと、1つ目はクロージャを介して初期化されるストアドプロパティで、そのクロージャは初期化時に1回だけ呼び出されます。もうひとつは、計算されたプロパティで get ブロックはそのプロパティを参照するたびに呼び出されます。


ストアドプロパティの初期化クロージャは一度だけ呼び出されますが、ストアドプロパティの値を後で変更することは可能です(ただし、その際に varlet ). これは、ストアドプロパティを初期化するコードを単一の簡潔なコードブロックにカプセル化したい場合に便利です。

しかし、計算されたプロパティのブロックは、変数を参照するたびに呼び出されます。計算されたプロパティを参照するたびにコードが呼び出されるようにしたい場合に便利です。一般的には、ストアドプロパティを参照するたびに計算されたプロパティを再計算する必要がある場合です(例えば、他の、おそらくプライベートな、ストアドプロパティから再計算されるなど)。

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


ところで、最初の例では、内部的に遅延的にインスタンス化されることを参照していますね。もしそのような動作をさせたいのであれば、そのために lazy キーワードを使用する必要があります。

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

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