2017-11-18 5 views
5

私は初心者であり、私はLazy Var対Letを理解しています。特にImageViewsでLazy Varを使用すると、メモリ使用量が大幅に節約されることに気付きました。しかし、私が今まで見たチュートリアルやガイドでは、Lazy Varを頻繁に使用していないので、悪い練習であることが疑わしく感じています。Swift - Lazy Varとビューをプログラムで作成するとき(メモリを節約するとき)

私は少し研究を行い、レイジーは「スレッドセーフ」ではないことを知りましたが、これが何を意味するのか分かりません。私は多くの長所と短所を見てきましたが、私は非常に限られた知識しか持っていないため、特に結論を出すことはできません。

いつUIViewを作成するときにLazy Var vs. Letを使用するのはいいですか?

lazy var profileImageView: UIImageView = { 

    let imageView = UIImageView(image: #imageLiteral(resourceName: "page1")) 
    imageView.translatesAutoresizingMaskIntoConstraints = false 
    imageView.contentMode = .scaleAspectFit 
    return imageView 

}() 
+0

ここには、「怠惰なvar」が何であるかの古い(Swift 1と思われる)説明があります。具体的には、いつ使用するかについてのセクションを参照してください:http://mikebuss.com/2014/06/22/lazy-initialization-swift/質問の右側の列にある3つの関連リンクを見てください。 *彼らはあなたのものに似ていますが、私は誰も*本当に*上記のリンクのように質問に答えることはできません。彼らは '怠け者'が何であるか(なぜ、 'var'を使わなければならないのか、なぜ何かが構築されないのか)を説明します。私はこの誰かがあなたに良い質問 – dfd

答えて

2

lazy varを使用するかどうかは、コードとそのコンテキストによって異なります。それは悪くないか良いことではありません。適切な時期を決めなければなりません。

これを決める前に、lazy varが何であるかを知る必要があります。

lazy varとは何ですか?

遅延初期化は、可変コンテンツの初期化(構築)が最初の使用まで遅延される概念です。そのような変数への最初のアクセスは、初期化をトリガします。遅延初期化された変数を使用すると、変数が使用される(必要な)までコンテンツが作成されないため、リソースを節約できます。

これは、遅延初期化の主な原因です。あなたがそれを必要とするまであなたは何かを作りません。それは、何かがlazy varであるべきかどうかを決定するときに使用するロジックです。

常に表示されている(必要な)ビュー(または他のもの)を扱っている場合、遅延初期化の使用にはほとんど意味がありません。一方、常に必要ではないインスタンスを扱う場合は、lazy varを使用することが正当です。

ビューが常に表示されているビューコントローラで表示されている場合、それを怠惰にすることで多くのことを達成することはできません。特定の状況(たとえば、ユーザーが折りたたまれたパネルを展開した場合など)でしか表示されない場合は、それを怠惰にすることが理にかなっています。 View Controllerの読み込み速度が速くなり、デフォルトでメモリ使用量が少なくなります。


スレッドの安全性に関する限り、lazy varはSwiftではスレッドセーフではありません。

つまり、2つの異なるスレッドが同じ変数に同時にアクセスしようとすると、そのような変数が初期化される前に、スレッドの1つが部分的に構築されたインスタンスにアクセスする可能性があります。

あなたには、スレッドの安全性についての詳細を見つけることができます:lazy varを使用するもう一つの利点は、コードの可読性を向上さ

Swift - is lazy var thread-safe?

Make "lazy var" threadsafe

2

あなたの例では、画像ビューに関連するコードは、イニシャライザ、セットアップ関数、またはviewDidLoadに広げられる代わりに一緒にグループ化されます。これにより、コードの読者がコードのさまざまな場所にアクセスしてビューの構成を理解する必要がなくなり、ローカルの推論が向上します。あなたの意見について学ぶためには、彼らはその宣言にジャンプする必要があります。

lazy varとマークされた初期化クロージャは、selfにアクセスすることができ、ターゲットアクションの追加やその他の定数プロパティの参照など、クロージャ内でより多くの設定を行うことができます。

クロージャを使ってプロパティ(特にビュー)を初期化することをお勧めします。lazy varは良い方法であり、Swiftコミュニティでも人気を集めているようです。

プロジェクトに応じて、開発者の時間を節約することは、システムメモリを節約するよりもはるかに価値があります。

関連する問題