屬性 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 中一定注意不要主動清理視圖或者控件 // 因為懶加載不會再次創建 } }