構(gòu)造方法
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的濱海新區(qū)網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
實例對象在被創(chuàng)建時,需要對存儲屬性初始化,兩種方式:
方法一:在聲明屬性的同時設(shè)定初值(之前一直使用這種方式)
方法二:使用構(gòu)造方法
構(gòu)造方法init:在對象創(chuàng)建時自動調(diào)用并對實例對象的存儲屬性進(jìn)行初始化
a. 無需func關(guān)鍵字聲明
b. 參數(shù)列表里可以有多個參數(shù),也可以沒有參數(shù),參數(shù)可以有默認(rèn)值
c. 支持重寫和重載
d. 沒有返回值
如:
class Person{
var name:String
var age:Int
init(name:String, age:Int) {
self.name = name
self.age = age
}
init(name1:String) {
self.name = name1
self.age = 11
}
init(name2:String) {
self.name = name2
self.age = 12
}
init() {
self.name = "123"
self.age = 20
}
}
var p1:Person = Person()
print("name:\(p1.name) age:\(p1.age)")//name:123 age:20
var p2:Person = Person(name1: "iOS")
print("name:\(p2.name) age:\(p2.age)")//name:iOS age:11
var p3:Person = Person(name2: "iOS")
print("name:\(p3.name) age:\(p3.age)")//name:iOS age:12
var p4:Person = Person(name: "iPhone", age: 7)
print("name:\(p4.name) age:\(p4.age)")//name:iPhone age:7
init()方法是強(qiáng)制包含外部參數(shù)名的,即使未顯式寫出,也是有的,相當(dāng)于參數(shù)名前有#,可以使用 _ 關(guān)閉這個強(qiáng)制功能
這里有四個重載的init()方法,其中有兩個方法僅僅外部參數(shù)名不同,也可以進(jìn)行重載(普通函數(shù)不可以)
構(gòu)造方法中的常量:
常量屬性,在構(gòu)造方法內(nèi)部是可以變的,即構(gòu)造方法執(zhí)行后才是真正的常量
注意:子類的構(gòu)造方法不能修改父類常量屬性的值
構(gòu)造方法的分類
默認(rèn)構(gòu)造方法:適用于類、結(jié)構(gòu)體、枚舉
當(dāng)所有的存儲屬性都有默認(rèn)值時由系統(tǒng)自動生成
如果存儲屬性是一個可選類型,則不必設(shè)置默認(rèn)值也能具有默認(rèn)構(gòu)造方法,其默認(rèn)值為nil
指定構(gòu)造方法:顯式地寫出并且可重載,需要為每個存儲屬性初始化
便捷構(gòu)造方法:內(nèi)部調(diào)用其他構(gòu)造方法
需要在init()前加convenience關(guān)鍵字聲明
只有在便捷構(gòu)造方法中可以顯式調(diào)用構(gòu)造方法,如:
convenience init() {
self.init(name:"123", age:20)
}
可失敗構(gòu)造方法:在某些情況下構(gòu)造對象失敗后,返回nil
返回nil,意味著返回值類型是一個可選類型,語法:init?()
可失敗構(gòu)造方法可以聲明為便捷構(gòu)造方法
如:
convenience init?(age:Int) {
self.init(name:"123", age:age)
if ( age < 0 ) {
return nil
}
}
var p1:Person? = Person(age: 5)
隱式解綁的可失敗構(gòu)造方法,即返回值是解綁后的,語法init!()
也就意味著返回值不再是一個可選類型,也就意味著可失敗構(gòu)造方法返回nil程序會崩潰
繼承中的構(gòu)造過程
先來看一段代碼:
class Animal {
var age:Int
init() {
self.age = 10
print("Animal init.")
}
}
class Dog:Animal {
var name:String
override init() {
self.name = "abc"
print("Dog init.")
}
}
var p = Dog()
print("age:\(p.age) name:\(p.name)")
輸出的結(jié)果:
Dog init.
Animal init.
age:10 name:abc
重要說明:子類的構(gòu)造方法一定調(diào)用了父類的構(gòu)造方法完成父類部分的初始化
父子類構(gòu)造方法的調(diào)用順序:
上面例子中,在子類的init()中并沒有顯式調(diào)用,則父類的init()實在子類init()的最后隱式調(diào)用
存在的問題是:在子類的init()中不能訪問父類的屬性
解決方法:子類的init()中顯式調(diào)用父類構(gòu)造方法
override init() {
self.name = "abc"
super.init()
self.age++
print("Dog init.")
}
需要注意的是:顯式調(diào)用父類構(gòu)造方法,必須在子類存儲屬性初始化后進(jìn)行
子類也可以添加構(gòu)造方法,子類構(gòu)造方法內(nèi)部也可以指定調(diào)用其他構(gòu)造方法
class Animal {
var age:Int
init() {
self.age = 10
}
init(age:Int) {
self.age = age
}
}
class Dog:Animal {
var name:String
override init() {
self.name = "abc"
super.init()
self.age++
}
init(age:Int, name:String) {
self.name = name
super.init(age: age)
}
}
var p = Dog(age: 22, name: "ABC")
print("age:\(p.age) name:\(p.name)")
析構(gòu)方法
與構(gòu)造方法相反,對象即將被銷毀前,會自動調(diào)用析構(gòu)方法
a. 析構(gòu)方法 deinit 不帶任何參數(shù)也沒有返回值,不用func修飾
b. 有默認(rèn)析構(gòu)方法,也可以顯式寫出代替
c. 析構(gòu)方法不能重載
d. 子類實例對象銷毀時,先調(diào)用子類的析構(gòu)方法,再調(diào)用父類的析構(gòu)方法
e. 任何位置都不能顯式調(diào)用deinit
class Animal {
var age:Int
init() {
self.age = 10
}
init(age:Int) {
self.age = age
}
deinit {
print("Animal deinit.")
}
}
class Dog:Animal {
var name:String
override init() {
self.name = "abc"
super.init()
self.age++
}
init(age:Int, name:String) {
self.name = name
super.init(age: age)
}
deinit {
print("Dog deinit")
}
}
var p = Dog(age: 22, name: "ABC")
print("age:\(p.age) name:\(p.name)")
p = Dog() //基于ARC機(jī)制,此時上一個Dog實例對象被銷毀
輸出結(jié)果:
age:22 name:ABC
Dog deinit
Animal deinit.
當(dāng)前標(biāo)題:Swift2.0(13)構(gòu)造方法
文章轉(zhuǎn)載:http://aaarwkj.com/article44/ispohe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管、響應(yīng)式網(wǎng)站、定制開發(fā)、虛擬主機(jī)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)