懶加載
懶加載的介紹
- swift中也有懶加載的方式
- (蘋果的設計思想:希望所有的對象在使用時才真正加載到內存中)
- 和OC不同的是swift有專門的關鍵字來實現懶加載
- lazy關鍵字可以用於定義某一個屬性懶加載
懶加載的使用
- 格式
lazy var 變量: 類型 = { 創建變量代碼 }()
- 懶加載的使用
// 懶加載的本質是,在第一次使用的時候執行閉包,將閉包的返回值賦值給屬性 // lazy的作用是只會賦值一次 lazy var array : [String] = { () -> [String] in return ["why", "lmj", "lnj"] }()
import UIKit class ViewController: UIViewController { lazy var names : [String] = { print("------") return ["why", "yz", "lmj"] }() override func viewDidLoad() { super.viewDidLoad() } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { _ = names.count _ = names.count _ = names.count _ = names.count _ = names.count _ = names.count } }
import UIKit class ViewController: UIViewController { // MARK:- 懶加載的屬性 /// tableView的屬性 lazy var tableView : UITableView = UITableView() // MARK:- 系統回調函數 override func viewDidLoad() { super.viewDidLoad() setupUI() } } // MARK:- 設置UI界面相關 extension ViewController { /// 設置UI界面 func setupUI() { // 0.將tableView添加到控制器的View中 view.addSubview(tableView) // 1.設置tableView的frame tableView.frame = view.bounds // 2.設置數據源 tableView.dataSource = self // 3.設置代理 tableView.delegate = self } } // MARK:- tableView的數據源和代理方法:1:設置代理多個代理用,隔開 2:相當於oc的#pragma:// MARK:- 2:若是沒有介詞,則用下划線來表示:_ tableView // extension類似OC的category,也是只能擴充方法,不能擴充屬性 extension ViewController : UITableViewDataSource, UITableViewDelegate{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 1.創建cell: let CellID = "CellID" var cell = tableView.dequeueReusableCell(withIdentifier: CellID) if cell == nil { // 在swift中使用枚舉: 1> 枚舉類型.具體的類型 2> .具體的類型 cell = UITableViewCell(style: .default, reuseIdentifier: CellID) } // 2.給cell設置數據:cell為可選類型,從緩存池中取出的cell可為空,所以為可選類型,最后返回cell的時候要進行強制解包,此時已經保證了可選類型不為空,若為空強制解包會為空 cell?.textLabel?.text = "測試數據:\((indexPath as NSIndexPath).row)" // 3.返回cell return cell! } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("點擊了:\((indexPath as NSIndexPath).row)") } }