timg.jpg
- 構造函數類似于OC中的初始化方法:init方法
- 默認情況下載創建一個類時,必然會調用一個構造函數
- 即便是沒有編寫任何構造函數,編譯器也會提供一個默認的構造函數。
- 如果是繼承自NSObject,可以對父類的構造函數進行重寫
創建Person類 繼承NSObject
- 聲明Name 屬性
class Person: NSObject {
// 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
var name: String
}
- 調用默認初始化器
class Person: NSObject {
// 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
var name: String
// 2 ,調用默認的初始化器 會報錯:(Property 'self.name' not initialized at implicitly generated super.init call(在調用父類 構造函數之前,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 ,調用默認的初始化器 會報錯:(Property 'self.name' not initialized at implicitly generated super.init call(在調用父類 構造函數之前,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 調用構造函數
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let person = Person();
print(person.name)
}
}
重寫,重載
重寫:父類有這個方法,子類重新實現 需要 override 關鍵字 如: override func viewDidLoad() {}
重載: 函數名相同 但是參數和個數不同,重載可以給自己的屬性從外部設置初始值, OC沒有重載,僅有initWith xxx 自定義初始化方法; 如果重載了構造函數,并不沒有實現父類 init 方法,系統不再提供init() 構造函數默認是有的
class Person: NSObject {
var name: String
// 重寫
override init() {
print("Person init")
name = "趙師順"
super.init()
}
//重載
init(name: String) {
self.name = name;
super.init()
}
}
調用Person的重載
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 調用系統 構造函數
let person = Person();
print(person.name)
// 重載
let p = Person(name: "隔壁老王")
print(p.name)
}
}
控制臺輸出結果
屏幕快照 2017-09-08 下午4.10.54.png
構造函數與KVC
注意事項:
1,定義模型屬性的時候,如果是對象,通常都是可選的
2, 如果是基本數據類型不能設置成可選的,而且要設置初始值
3,使用KVC 方法之前 應該調用 super.init()
4,如果使用KVC 設置數值,屬性不能是private 的
class Person: NSObject {
// 在OC中很多屬性都是在需要的時候創建
// 因為在手機開發,內存寶貴,有些屬性并不一定需要分配空間
// 延遲加載,在需要的時候在創建
var name: String?
// 給基本數據類型做初始化
var age = 0
// 如果是Private 私有屬性,使用KVC設置值的時候,同樣無法設置
// 如果設置成private 禁止外部訪問
private var title: String?
// 重載構造函數,使用字典為本類設置初始值
init(dict: [String: AnyObject]) {
super.init()
// Use of 'self' in method call 'setValuesForKeys' before super.init initializes self(在使用setValuesForKeys之前 調用 super.init)
// KVC 方法是 OC方法,特點就是在運行時給對象發送消息
// 所以要求 對象已經實例化完成 而且name 是個可選值 所以 super.init() 放在前面
setValuesForKeys(dict)
}
}
調用
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let p = Person(dict: ["name": "肇事順" as AnyObject])
print(p.name ?? "")
}
}