標籤:架構 實現 xcode 機制 命名空間 set rms uilabel 日常
懶載入、計算型屬性、反射機制
1.懶載入:
目的:1.延遲建立,需要時載入,節省記憶體空間
2.避免開發中處理解包的問題(重要!!!)
知識:1.所有的UIView 及子類在開發是,一旦重寫了夠著函數,必須要實現initwithcoder函數以保證提供兩個通道,目前Xcode會有提示。
2.在swift中懶載入的簡單寫法
lazy var label:UILabel = UILabel()
3.懶載入本質上是一個閉包,完整寫法如下:
{}封裝代碼 ()執行代碼
lazy var labe = {()->UILabel in
let l = UILabel()
return l
}()
注意的是瞭解就好,因為日常開發法中在閉包中的提示不太好,且需要注意循環參考
4.懶載入和OC的區別:
(1)在OC中是使用get方法實現懶載入的。
(2)OC中只要設定成nil以後,可以再通過get方法重新載入,而在swift中懶載入只能載入一次,如果設定成nil以後,就不能直接通過懶載入重新建立
2.計算型屬性
引導:
1.getter & setter 僅用於示範,日常開發不用:
private var _name:String?
var name:String{
get{
return _name
}
set{
_name = newValue
}
}
2. readonly 的實現:重寫getter方法,通過唯寫get方法實現。
var title:String{
get{
return “mr 老王”
}
}
計算型屬性:
1.readonly 簡寫 :直接return
var title:String{
return “老王”
}
其實這就是一個計算型屬性:本身是不儲存內容,都是通過計算獲得的。類似於一個函數,沒有參數只有傳回值,每次計算都會重新計算一次。
3.懶載入和計算型屬性的區別
1.代碼非常類似!!! 懶載入只是多了一個 ‘lazy’ 和’=’
2.懶載入會在第一次訪問的時候執行,閉包執行結束後會儲存結果到屬性,第二次調用的時候是不會重新執行閉包的。計算型屬性每次訪問都會執行一次閉包
4.利用重寫set方法實現通過模型賦值改變UI
var person:Person? {
didSet {
//此時name屬性有值,可以直接使用
self.text = person?.name
}
}
5.命名空間&反射機制
1.反射機制的概念
(1)在任意一個類,都能通過方法來擷取這個類的所有屬性和方法
(2)對於任何一個對象,都能調用他的任意一個方法和屬性
(3)這種動態擷取資訊及動態調用對象的方法功能成為Java 語言的反射機制
2.在OC中如何使用反射機制
(1)利用NSClassFromString 方法來使用字串擷取類
(2)isMemberofClass
(3)isKindofClass
(4)conformstoprotorol
(5)respondstoselector
(6)performSelector 或者obj_msgSend
3.主義事項:
(1)在Swift中有命名空間
(2)在同一個命名空間全域共用
(3)第三架構使用swift如果直接拖拽到項目中,從屬於同一個命名空間可能會有重提
(4)在Swift中 NSClassFromString 是需要在前面添加命名空間的,例如: let clsName = “反射機制.ViewController”
(5)反射重要的目的就是為瞭解耦
(6)可以搜尋“反射機制和Factory 方法”繼續學習反射機制
4.動態獲得命名空間:
4.1 在info.plist中 bundle name 就是命名空間
4.2 info.plist 需要從bundle.main.infoDictionary讀取
4.3 所以命名空間為:Bundle.main.infoDictionary[“CFBundleName”]
4.4 通過寫分類實現代碼精簡:
4.4.1 通過函數調用
4.4.2 通過計算型屬性。這種方法可以增加代碼的可閱讀型。
//demo:https://github.com/fushengit/Learn-Swift
Swift學習(4懶載入、計算型屬性、反射機制)