構(gòu)造函數(shù)的基礎(chǔ)
構(gòu)造函數(shù)是一種特殊的函數(shù)
- 主要用來在創(chuàng)建對(duì)象時(shí)初始化對(duì)象
- 為對(duì)象成員變量設(shè)置初始值
在OC中的構(gòu)造函數(shù)是initwithxxx,在swift中由于支持函數(shù)重載,所有的構(gòu)造函數(shù)都是init
重載overload的概念
- 函數(shù)名相同
- 參數(shù)類型和個(gè)數(shù)不同
重寫override的概念
父類存在相同的方法
-
子類重新編寫父類方法實(shí)現(xiàn)
import UIKit /** 1.給自己的屬性分配空間并且設(shè)置初始值 2.調(diào)用父類的構(gòu)造函數(shù),給父類的屬性分配空間設(shè)置初始值 NSObject 沒有屬性,只有一個(gè)成員變量isa */ // Class 'Person' has no initializers //Person類沒有‘初始化’s,構(gòu)造函數(shù),可以有多個(gè),默認(rèn)的是init class Person: NSObject { var name: String // Overriding declaration requires an 'override' keyword //重寫 -> 父類有這個(gè)方法,子類重新實(shí)現(xiàn),需要override關(guān)鍵字 // Property 'self.name' not initialized at implicitly generated super.init call //implicitly(隱式生成的super.init)調(diào)用父類的構(gòu)造函數(shù)之前,屬性 self.name沒有被初始化 override init() { print("person init") name = "zhang" //Property 'self.name' not initialized at super.init call //在調(diào)用父類super.init的時(shí)候,沒有給self.name初始化->分配空間,設(shè)置初始值 super.init() //name = "li" } }
調(diào)用:
//在swift中所有的類都默認(rèn)有一個(gè)命名空間
//同一個(gè)person類可以從屬于不同的命名空間
import UIKit
/**
在swift中,默認(rèn)同一個(gè)項(xiàng)目中(同一個(gè)命名空間下),所有的類都是共享的,可以直接訪問,不需要import
所有的對(duì)象屬性var,也可以直接訪問到
*/
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//實(shí)例化person
// ()-> alloc/init
//swift中對(duì)應(yīng)一個(gè)函數(shù)init()構(gòu)造函數(shù)
//作用:給成員變量分配空間,初始化成員變量
let p = Person()
print(p)
print(p.name)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
接著來個(gè)子類繼承父類的重寫:
import UIKit
class Student: Person {
//學(xué)號(hào)
var no:String = ""
//重寫person的構(gòu)造函數(shù),父類方法不能滿足需求
override init() {
print("student init")
no = "001"
super.init()
}
}
調(diào)用:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//實(shí)例化person
// ()-> alloc/init
//swift中對(duì)應(yīng)一個(gè)函數(shù)init()構(gòu)造函數(shù)
//作用:給成員變量分配空間,初始化成員變量
let p = Person()
let s = Student()
print(s.name + "-----" + s.no)
print(p)
print(p.name)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
打印的如下:
person init
student init
person init
zhang-----001
<_08_ê??è???áΩê?∞.Person: 0x610000050110>
zhang
student繼承自person,所以可以訪問到person中的屬性,也可以重寫父類的方法。