計算資産とクロージャ付き資産集合の違い
質問
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
ブロックはそのプロパティを参照するたびに呼び出されます。
ストアドプロパティの初期化クロージャは一度だけ呼び出されますが、ストアドプロパティの値を後で変更することは可能です(ただし、その際に
var
を
let
). これは、ストアドプロパティを初期化するコードを単一の簡潔なコードブロックにカプセル化したい場合に便利です。
しかし、計算されたプロパティのブロックは、変数を参照するたびに呼び出されます。計算されたプロパティを参照するたびにコードが呼び出されるようにしたい場合に便利です。一般的には、ストアドプロパティを参照するたびに計算されたプロパティを再計算する必要がある場合です(例えば、他の、おそらくプライベートな、ストアドプロパティから再計算されるなど)。
この場合、あなたは間違いなく計算されたプロパティ(2番目の例)ではなく、ストアドプロパティ(最初の例)が必要です。おそらく、変数を参照するたびに新しいプッシュ動作オブジェクトが必要になることはないでしょう。
ところで、最初の例では、内部的に遅延的にインスタンス化されることを参照していますね。もしそのような動作をさせたいのであれば、そのために
lazy
キーワードを使用する必要があります。
lazy var pushBehavior: UIPushBehavior = {
let behavior = UIPushBehavior()
behavior.setAngle(50, magnitude: 50)
return behavior
}()
しかし、もし、そのプロパティが
static
である場合、それは自動的に遅延的にインスタンス化されます。
関連
-
[解決済み] Swiftのstatic funcとclass funcの違いは何ですか?
-
[解決済み] Swift言語におけるエクスクラメーションマークの意味とは?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Swiftでdispatch_onceのシングルトンモデルを使う
-
[解決済み] Swiftのクラスにおける静的関数/変数とクラス関数/変数?
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
-
[解決済み】Swiftで2つのDate(月/日/時間/分/秒)の差を取得する。
-
[解決済み] DispatchQueue.main.asyncとDispatchQueue.main.syncの相違点
-
[解決済み] ""内の二重引用符を印刷するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Swift Error fatal error: Optional value のアンラップ中に予期せず nil を発見した。
-
[解決済み] Swift 1.2では、宣言は「final」と「dynamic」の両方にはなり得ないというエラーがある
-
[解決済み] Swift - 複数条件でオブジェクトの配列を並べ替える
-
[解決済み] Swift の @escaping と Completion ハンドラ
-
[解決済み] Swiftのif letと論理AND演算子&&の使い分け
-
[解決済み] SwiftUIのDSLを可能にするものは何ですか?
-
[解決済み] Swiftで失敗しないイニシャライザーを実装するためのベストプラクティス
-
[解決済み] swift 3.0 Data to String?
-
[解決済み] Swiftのインライン条件?
-
[解決済み] Codableクラスはプロトコルに準拠していない Decodable