timg.jpg
- 構(gòu)造函數(shù)類似于OC中的初始化方法:init方法
- 默認(rèn)情況下載創(chuàng)建一個(gè)類時(shí),必然會(huì)調(diào)用一個(gè)構(gòu)造函數(shù)
- 即便是沒有編寫任何構(gòu)造函數(shù)秀撇,編譯器也會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù)蒋院。
- 如果是繼承自NSObject,可以對父類的構(gòu)造函數(shù)進(jìn)行重寫
創(chuàng)建Person類 繼承NSObject
- 聲明Name 屬性
class Person: NSObject {
// 1剔桨,聲明name 屬性 會(huì)報(bào)錯(cuò):(Class 'Person' has no initializers (Person類沒有初始化器 默認(rèn)是init))
var name: String
}
- 調(diào)用默認(rèn)初始化器
class Person: NSObject {
// 1届谈,聲明name 屬性 會(huì)報(bào)錯(cuò):(Class 'Person' has no initializers (Person類沒有初始化器 默認(rèn)是init))
var name: String
// 2 ,調(diào)用默認(rèn)的初始化器 會(huì)報(bào)錯(cuò):(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 屬性 會(huì)報(bào)錯(cuò):(Class 'Person' has no initializers (Person類沒有初始化器 默認(rèn)是init))
var name: String
// 2 ,調(diào)用默認(rèn)的初始化器 會(huì)報(bào)錯(cuò):(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 初始化 分配空間商架,設(shè)置初始值)
// 所以在 super.init() 之前 給name 賦值
name = "iOSCodeZhao"
print("-----------------Person init()-----------------")
super.init()
}
}
實(shí)例化Person 調(diào)用構(gòu)造函數(shù)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let person = Person();
print(person.name)
}
}
重寫,重載
重寫:父類有這個(gè)方法芥玉,子類重新實(shí)現(xiàn) 需要 override 關(guān)鍵字 如: override func viewDidLoad() {}
重載: 函數(shù)名相同 但是參數(shù)和個(gè)數(shù)不同蛇摸,重載可以給自己的屬性從外部設(shè)置初始值, OC沒有重載灿巧,僅有initWith xxx 自定義初始化方法赶袄; 如果重載了構(gòu)造函數(shù),并不沒有實(shí)現(xiàn)父類 init 方法抠藕,系統(tǒng)不再提供init() 構(gòu)造函數(shù)默認(rèn)是有的
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)
}
}
控制臺(tái)輸出結(jié)果
屏幕快照 2017-09-08 下午4.10.54.png
構(gòu)造函數(shù)與KVC
注意事項(xiàng):
1饿肺,定義模型屬性的時(shí)候,如果是對象盾似,通常都是可選的
2敬辣, 如果是基本數(shù)據(jù)類型不能設(shè)置成可選的,而且要設(shè)置初始值
3,使用KVC 方法之前 應(yīng)該調(diào)用 super.init()
4溉跃,如果使用KVC 設(shè)置數(shù)值村刨,屬性不能是private 的
class Person: NSObject {
// 在OC中很多屬性都是在需要的時(shí)候創(chuàng)建
// 因?yàn)樵谑謾C(jī)開發(fā),內(nèi)存寶貴撰茎,有些屬性并不一定需要分配空間
// 延遲加載嵌牺,在需要的時(shí)候在創(chuàng)建
var name: String?
// 給基本數(shù)據(jù)類型做初始化
var age = 0
// 如果是Private 私有屬性,使用KVC設(shè)置值的時(shí)候乾吻,同樣無法設(shè)置
// 如果設(shè)置成private 禁止外部訪問
private var title: String?
// 重載構(gòu)造函數(shù)髓梅,使用字典為本類設(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方法,特點(diǎn)就是在運(yùn)行時(shí)給對象發(fā)送消息
// 所以要求 對象已經(jīng)實(shí)例化完成 而且name 是個(gè)可選值 所以 super.init() 放在前面
setValuesForKeys(dict)
}
}
調(diào)用
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let p = Person(dict: ["name": "肇事順" as AnyObject])
print(p.name ?? "")
}
}