Swift學習筆記十:屬性與懶加載 Property & Lazy


屬性 Property

  • getter  &  setter 方法
 // getter & setter 僅供演示, 日常開發不用
   
    private var _name: String?
   
    // Swift 中, 一般不會重寫 getter 方法和 setter 方法
    var name: String? {
       
        get
        {
            // 返回成員變量
            return _name
        }
       
        set
        {
            // 使用 成員變量 記錄值
            _name = newValue
        }
    }

 

  • 計算型屬性(只讀屬性)
  // OC 中定義屬性的時候, 有一個 readonly ---> 重寫 getter 方法
    var title: String {
       
        // 只重寫了 getter 方法, 沒有重寫 setter 方法
        get
        {
            return "Mr. " + (name ?? "")
        }
    }
   
    // 只讀屬性的簡寫, 又稱之為計算行屬性: 本身不保存內容, 都是通過計算獲得結果
    // 類似於一個函數: 沒有參數, 一定有返回值
    var title2: String {
       
        return "Mr. " + (name ?? "")
    }
 
  • didSet 方法
class DemoLabel: UILabel {

    // 模型 ---> 給視圖設置模型, 由視圖自己根據模型的數據顯示內容
    var person: Student? {
       
        // 就是替代 OC 中重寫 setter 方法
        // 區別: 再也不需要考慮  _成員變量 = 值
        // OC 中如果是 copy 屬性, 應該 _成員變量 = [值 copy]
        didSet
        {
            // 此時 name 屬性已經有值, 可以直接使用設置 UI 內容
            text = person?.name
        }
    }
}
 
 
懶加載 Lazy
  • 延遲加載, 減少內存的消耗
  • 可以解除解包的煩惱
class ViewController: UIViewController {
   
   
    var label: DemoLabel?
   
    // 初始化並且分配空間 label, 會提前創建
    // 在移動端開發, 延遲加載 減少內存消耗
    // 懶加載 - lazy
    /*
        1. 能夠延遲創建
        2. 最大的好處, 可以解除解包的煩惱
     */
   
    // lazy var label2: DemoLabel = DemoLabel()
   
    // 懶加載本質上是一個 閉包
    // 懶加載會在第一次訪問的時候執行, 閉包執行結束后, 會把結果保存在 屬性 中
    // 后續調用, 直接返回 屬性 的內容
    // 懶加載的屬性會分配空間, 存儲值
    // 只要調用過一次, 懶加載后面的閉包再也不會執行了
   
    // 完整寫法
    /*
        {} 包裝代碼
        () 執行代碼
    
        日常開發:
        1. 閉包中的智能提示不好
        2. 閉包中如果出現 self. 還需要注意循環引用
     */
    lazy var label2 = { () -> DemoLabel in
       
        let l = DemoLabel()
       
        // 設置 Label 的屬性...
       
        return l
    }()
   
    // 注意: 一旦 label 被設置為 nil, 懶加載也不會再次執行
    // 懶加載的代碼只會在第一次調用的時候, 執行閉包, 然后將閉包的結果保存在 label 的屬性中
    private lazy var label3: UILabel? = UILabel()
   

    override func viewDidLoad() {
        super.viewDidLoad()
       

        // 設置 UI
        setupUI()
       
       
        label3?.text = "hello"
        label3?.sizeToFit()
       
        print(label3 as Any)
       
        label3 = nil
       
        print(label3 as Any)
    }
   
    private func setupUI()
    {
        // 1. swvf控件
        label = DemoLabel()
       
        // 添加到視圖
        // ! 解包, 為了參與計算, addSubView 用 subViews 數組記錄控件, 數組中不允許加入 nil
        // ? 可選解包, 調用方法, 如果為 nil, 不調用方法, 但是不能參與計算
        view.addSubview(label!)
       
        label?.text = "hello"
        label?.sizeToFit()
        label?.center = view.center
    }
   
    override func didReceiveMemoryWarning()
    {
        // Swift 中一定注意不要主動清理視圖或者控件
        // 因為懶加載不會再次創建
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM