懶加載讓你可以在需要的時候才初始化, 而不是在初始化這個對象的時候就必須要裸燎。懶加載可以用來避免 optional 的使用, 當某個屬性的初始化耗費很多資源的時候會提升性能。當然使用懶加載也能讓對象的初始化方法看起來很清爽, 因為某些設置會在這個對象的生命周期中被推遲绰更。
這周我們來學習一下 Swift 中懶加載的定義, 以及使用。
基本用法
定義一個懶加載屬性最簡單的辦法就是在 var
前加一個 lazy
關鍵字, 并且還要給 出默認的值。這個默認值會在這個屬性被第一次訪問的時候被指定, 也就是說在這個對象的初始化方法中這個就不需要再去初始化這個屬性了楷拳。
class FileLoader {
private lazy var cahce = Cache<File>()
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
中
使用自執(zhí)行閉包
除了使用工廠方法來返回這個屬性值以外, 你也可以選擇在這個屬性聲明的地方通過一個自執(zhí)行的閉包來出初始化這個屬性。我們看看上面這個情況, 我們應該怎么做吧浓领!
private lazy var eventManager: EventManager = {
let manager = EventManager()
return manager
}()
這要做有一個好處: 讓這個屬性的在同一個地方聲明和設置典阵。當然閱讀這些代碼可能會比較不爽。特別是在這個屬性的設置需要很長的代碼的時候镊逝。我自己的規(guī)則是當這個屬性的初始化方法只有兩三行代碼的時候壮啊。就是使用這樣的方法來初始化懶加載屬性。
使用靜態(tài)工廠方法
對于那些設置起來更復雜屬性, 把這些代碼放到其他的類中, 會是更好的辦法撑蒜。這么做, 可以讓這個類更加專注于它自己的職責, 讓這個類不至于那么復雜歹啼。當然這也可以在不使用子類的條件下, 在多個類中共享代碼。
private lazy var actionButton: UIButton = ViewFactory.makeActionButton()
在這個例子中, ViewFactory
這個類包含了這個 controller
中所有控件的初始化方法座菠。不用引入更多的類, 也不用讓繼承樹變復雜狸眼。如果我們希望在另外一個 controller
中使用這個按鈕, 也只需要調(diào)用同一個 API 就好了 ViewFactory.makeActionButton()
總結
可能有人會問, 有沒有什么大一統(tǒng)的方法來使用懶加載呢? 個人認為沒有. 寫代碼就是這樣, 選擇最合適的方法來處理不同的業(yè)務需求才是最正確的做法浴滴。而且我自己也在日常開發(fā)中使用上面所有的方法拓萌。
Twitter 有一個問題: 使用不同的方法, 對編譯時間有什么影響呢?我做了一些基本的測試, 并沒有發(fā)現(xiàn)這其中有什么差別升略。當然這也跟這個懶加載屬性有關微王。
Thanks for reading! ??