2017-01-19 8 views
3

私の理解では、それは怠惰なプロパティがたりないかもしれないプロパティの初期設定を初期化する必要があり、および/または 正しい使用は怠惰なインスタンス化の

    • 例で使用されるべきであるということです潜在的に高価であり、かつ/または
    • プロパティの初期化は、あらかじめ分かっていないかもしれない他のパラメータに依存します。

    そして、まだ、私は[擬似コード]このようなコード間でより来て、より多くの:itemSizeは常に初期化する必要がありますので、私には

    class SomeClass { 
        lazy var itemSize: CGSize = { return CGSize(width: 80, height: 80) }() 
    
        .... 
        init() { 
         [use itemSize for some init work] 
        } 
    } 
    

    、これは意味がない、高価ではありません未知の特性に依存しない。何か不足していますか?

  • +0

    大規模なviewDidLoadを持つ一部の人々とは対照的に、小さな怠惰なコードブロックに何かを設定できるので、そのプロパティーのさまざまな側面を構成することができます。 – SeanLintern88

    +0

    @ SeanLintern88コードブロックは、それが怠け者であることに関連付けられていません。すべてのプロパティは、そのようなブロックでインスタンス化することができます。私はよく、クラスの残りの部分がアクセスする必要のあるプロパティを設定するために、 'blah:UILabel = {...}()'を使用します。関数内で変数などを作成するためにも使用できます...プロパティだけでなく、 – Fogmeister

    +0

    別の関連する洞察力: 'lazy'インスタンスのプロパティーは変更できません。しかし、すべての_type_プロパティー( 'static ...'/'class ...')はデフォルトでは 'lazy'です。したがって、 'lazy'不変プロパティ、つまり不変型プロパティがあります。 – dfri

    答えて

    1

    lazyインスタンスプロパティの最も一般的な理由は、実際には省略されています(または省略されています)。つまり、明示的または暗黙的にselfを参照できます。

    別のポイント:lazyインスタンスプロパティは、匿名関数を定義して呼び出す必要はありません。愚かな例では、そうするための理由はありません。

    lazy var itemSize: CGSize = CGSize(width: 80, height: 80) 
    

    両方lazyと定義-と、通話が有用であり、一緒にしばしば有用であるが、それらを混同しないでください:これは、同じようによくやっていると思います。

    +1

    いくつかの例については、私の本を参照してください:http://www.apeth.com/swiftBook/ch03.html#_lazy_initialization – matt

    3

    あなたは間違いなしです。

    この特定のケースでは、遅延インスタンス化の必要はありません。

    あなたが言ったケースも正しいです。

    しかし、この場合、遅延インスタンス化を使用すると大きな害を及ぼさないはずです。

    しかし、もし私がそれが好きだと私はそれをletに変更し、lazyを削除したとします。 (特に突然変異が起こっていない場合)。

    +1

    残念なことに 'lazy let'は違法です。 – matt

    +0

    @mattはい、違法ではないとは言いませんでしたか?だから私は '怠け者 'ではなく'レット 'を使うだろう。多分私はそれをクリアするでしょう。 – Fogmeister

    関連する問題