Using lazy properties in Swift

2464 ワード

image.png
怠惰なロードは、このオブジェクトを初期化するときに必要ではなく、必要なときに初期化することができます.怠け者のロードはoptionalの使用を避けるために使用でき、ある属性の初期化に多くのリソースがかかるとパフォーマンスが向上します.もちろん、怠惰なロードを使用しても、オブジェクトの初期化方法がさわやかに見えます.いくつかの設定がこのオブジェクトのライフサイクルで遅延されるためです.
今週はSwiftの怠け者ロードの定義と使用について学びましょう.
基本的な使い方
怠け者のロードプロパティを定義する最も簡単な方法は、varの前にlazyのキーワードを追加し、デフォルトの値を与えることです.このデフォルト値は、このプロパティが最初にアクセスされたときに指定されます.つまり、このオブジェクトの初期化方法では、このプロパティを初期化する必要はありません.
class FileLoader {
    private lazy var cahce = Cache()
    
    func loadFile(name name: String) throws -> File {
        if let cachedFile = cahce[name] {
            return cachedFile
        }
        let file = try loadFileFromDisk(fileName: name)
        cahce[name] = file
        return file
    }
}

工場メソッドの使用
このプロパティを怠惰にロードするときに何かを設定する必要がある場合がありますが、簡単に初期化方法を使用するとそんなに便利ではないかもしれません.この場合,より便利な方法は,この属性の初期化エージェントをファクトリメソッドに与えることである.
class Scene {
    private lazy var eventManager: EventManager = self.makeEventManager()
    private func makeEventManager() -> EventManager{
        let manager = EventManager()
        return manager
    }
}

もしあなたのクラスの中にmake..()のような工場の方法がすべてあることを望んでいないならば、あなたはこれらの方法を専門のextensionの中に置くことができます.
自己実行クローズの使用
ファクトリメソッドを使用してこのプロパティ値を返す以外に、このプロパティ宣言の場所で自己実行の閉パッケージを使用してこのプロパティを初期化することもできます.この状況を見てみましょう.どうすればいいですか.
    private lazy var eventManager: EventManager = {
       let manager = EventManager()
        return manager
    }()

これには、このプロパティを同じ場所で宣言して設定するメリットがあります.もちろん、これらのコードを読むと気分が悪くなるかもしれません.特にこの属性の設定に長いコードが必要な場合.私自身のルールは、この属性の初期化方法が2、3行のコードしかない場合です.このような方法を使用して、怠け者のロードプロパティを初期化します.
静的ファクトリメソッドの使用
より複雑なプロパティを設定する場合は、これらのコードを他のクラスに配置すると、より良い方法になります.このようにして、このクラスをもっと自分の職責に集中させ、このクラスをそんなに複雑にしないようにすることができます.もちろん、これはサブクラスを使用しない条件で、複数のクラスでコードを共有することもできます.
private lazy var actionButton: UIButton = ViewFactory.makeActionButton()

この例では、ViewFactoryというクラスは、このcontrollerのすべてのコントロールの初期化方法を含む.より多くのクラスを導入したり、継承ツリーを複雑にしたりする必要はありません.このボタンを別のcontrollerで使用したい場合は、同じAPIを呼び出すだけでいいViewFactory.makeActionButton()まとめ
怠け者のロードを使う方法はありますか?個人的にはないと思います.コードを書くことは、異なるビジネスニーズを処理するために最適な方法を選択することが最も正しい方法です.そして私自身も日常開発で上記のすべての方法を使っています.
Twitterで質問があります.異なる方法を使って、コンパイル時間にどのような影響がありますか?基本的なテストをしましたが、その違いは見つかりませんでした.もちろんこれもこの怠け者のロード属性と関係があります.
Thanks for reading!