
timg.jpg
- 構(gòu)造函數(shù)類似于OC中的初始化方法:init方法
- 默認情況下載創(chuàng)建一個類時,必然會調(diào)用一個構(gòu)造函數(shù)
- 即便是沒有編寫任何構(gòu)造函數(shù),編譯器也會提供一個默認的構(gòu)造函數(shù)。
- 如果是繼承自NSObject,可以對父類的構(gòu)造函數(shù)進行重寫
創(chuàng)建Person類 繼承NSObject
- 聲明Name 屬性
class Person: NSObject {
// 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
var name: String
}
- 調(diào)用默認初始化器
class Person: NSObject {
// 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
var name: String
// 2 ,調(diào)用默認的初始化器 會報錯:(Property 'self.name' not initialized at implicitly generated super.init call(在調(diào)用父類 構(gòu)造函數(shù)之前,self.name 沒有被初始化))
override init() {
print("-----------------Person init()-----------------")
super.init()
}
}
- 給name賦值
class Person: NSObject {
// 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
var name: String
// 2 ,調(diào)用默認的初始化器 會報錯:(Property 'self.name' not initialized at implicitly generated super.init call(在調(diào)用父類 構(gòu)造函數(shù)之前,self.name 沒有被初始化))
override init() {
//3,Property 'self.name' not initialized at super.init call (提示 self.name 初始化 分配空間,設置初始值)
// 所以在 super.init() 之前 給name 賦值
name = "iOSCodeZhao"
print("-----------------Person init()-----------------")
super.init()
}
}
實例化Person 調(diào)用構(gòu)造函數(shù)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let person = Person();
print(person.name)
}
}
重寫,重載
重寫:父類有這個方法,子類重新實現(xiàn) 需要 override 關鍵字 如: override func viewDidLoad() {}
重載: 函數(shù)名相同 但是參數(shù)和個數(shù)不同,重載可以給自己的屬性從外部設置初始值, OC沒有重載,僅有initWith xxx 自定義初始化方法; 如果重載了構(gòu)造函數(shù),并不沒有實現(xiàn)父類 init 方法,系統(tǒng)不再提供init() 構(gòu)造函數(shù)默認是有的
class Person: NSObject {
var name: String
// 重寫
override init() {
print("Person init")
name = "趙師順"
super.init()
}
//重載
init(name: String) {
self.name = name;
super.init()
}
}
調(diào)用Person的重載
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 調(diào)用系統(tǒng) 構(gòu)造函數(shù)
let person = Person();
print(person.name)
// 重載
let p = Person(name: "隔壁老王")
print(p.name)
}
}
控制臺輸出結(jié)果

屏幕快照 2017-09-08 下午4.10.54.png
構(gòu)造函數(shù)與KVC
注意事項:
1,定義模型屬性的時候,如果是對象,通常都是可選的
2, 如果是基本數(shù)據(jù)類型不能設置成可選的,而且要設置初始值
3,使用KVC 方法之前 應該調(diào)用 super.init()
4,如果使用KVC 設置數(shù)值,屬性不能是private 的
class Person: NSObject {
// 在OC中很多屬性都是在需要的時候創(chuàng)建
// 因為在手機開發(fā),內(nèi)存寶貴,有些屬性并不一定需要分配空間
// 延遲加載,在需要的時候在創(chuàng)建
var name: String?
// 給基本數(shù)據(jù)類型做初始化
var age = 0
// 如果是Private 私有屬性,使用KVC設置值的時候,同樣無法設置
// 如果設置成private 禁止外部訪問
private var title: String?
// 重載構(gòu)造函數(shù),使用字典為本類設置初始值
init(dict: [String: AnyObject]) {
super.init()
// Use of 'self' in method call 'setValuesForKeys' before super.init initializes self(在使用setValuesForKeys之前 調(diào)用 super.init)
// KVC 方法是 OC方法,特點就是在運行時給對象發(fā)送消息
// 所以要求 對象已經(jīng)實例化完成 而且name 是個可選值 所以 super.init() 放在前面
setValuesForKeys(dict)
}
}
調(diào)用
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let p = Person(dict: ["name": "肇事順" as AnyObject])
print(p.name ?? "")
}
}