遍歷構造函數在類別中使用比較常見,如在UIColor+Extension實現一個簡單的遍歷構造函數:
extension UIColor {
convenience init(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat = 1.0) {
self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: a)
}
}
遍歷構造函數目的:
1、條件判斷,只有滿足條件,才實例化對象,可以防止造成不必要的內存開銷
2、簡化對象創建
3、本身不負責屬性的創建和初始化工作
遍歷構造函數注意事項:
1、使用convenience關鍵字
2、便利構造函數允許返回nil
- 正常的構造函數一定會創建對象
- 判斷給定的參數是否符合條件,如果不符合條件,直接返回nil,不會創建對象,減少內存開銷。
3、只用便利構造函數中,才能使用self.init 構造當前對象 - 沒有convenience關鍵字的構造函數式負責創建對象的,反之用來檢查條件的,本身不負責對象的創建。
4、注意init后面有?
5、如果在遍歷構造函數中使用當前對象的屬性,一定要在self.init之后。
6、在實際開發中寫的很少,但是系統方法創建對象時有很多便利構造函數
class Person: NSObject {
var name: String?
var age: Int = 0
//遍歷構造函數
convenience init?(name: String,age: Int) {
if age > 100{
return nil
}
//實例化當前對象
self.init()
//代碼執行到此 self才允許被訪問,才能夠訪問到對象的屬性
self.name = name
}
}
遍歷函數的實際使用案例,使用遍歷構造函數是抽取UITextField控件。創建一個Swift文件,命名為UITextField+extension,然后實現如下代碼。
//extension類似于OC中的Category
extension UITextField{
convenience init(placeholder: String?, fontSize: CGFloat = 14,frame: CGRect){
//實例化當前對象
self.init()
//訪問屬性
self.frame = frame
self.borderStyle = .roundedRect
self.placeholder = placeholder
self.font = UIFont.systemFont(ofSize: fontSize)
}
}
外部代碼調用形式。
let tf = UITextField(placeholder: "占位文本", fontSize: 15, frame: CGRect(x: 50, y: 100, width: 100, height: 30))
view.addSubview(tf)