構(gòu)造函數(shù)和析構(gòu)函數(shù)

簡介

構(gòu)造過程:結(jié)構(gòu)體在和類在創(chuàng)建實例的過程中需要進行一些初始化工作渊迁,這個過程等稱之為構(gòu)造過程
析構(gòu)過程:類和結(jié)構(gòu)體在最后被釋放的時候需要進行一些釋放資源的操作楼眷,這個過程稱之為析構(gòu)過程

構(gòu)造函數(shù)

類和結(jié)構(gòu)體的實例在構(gòu)造過程中會調(diào)用一種特殊的init方法贴谎,稱之為構(gòu)造函數(shù)慧库。構(gòu)造函數(shù)沒有返回值逛揩,可以重載柠傍。多個構(gòu)造函數(shù)重載的情況下,運行環(huán)境會根據(jù)它的參數(shù)標簽或者是參數(shù)列表調(diào)用合適的構(gòu)造函數(shù)辩稽。

  1. 默認構(gòu)造函數(shù)
    如果我們沒有編寫任何的構(gòu)造函數(shù)惧笛,類和結(jié)構(gòu)體會提供一個默認的構(gòu)造函數(shù)。下面的例子中逞泄,rect的初始化就調(diào)用了默認的構(gòu)造函數(shù)
class Rectangle {
    var width: Double = 0.0
    var height: Double = 0.0
}
var rect = Rectangle()
rect.height = 1.0
rect.width = 2.0

類和結(jié)構(gòu)體的默認構(gòu)造函數(shù)有所不同患整,結(jié)構(gòu)體的默認構(gòu)造函數(shù)可以按照從上到下的順序把屬性名作為參數(shù)標簽,依次提供參數(shù)喷众,代碼示例如下:

struct Rectangle {  
  var width: Double
    var height: Double
    //默認構(gòu)造函數(shù)實現(xiàn)
    init(width: Double, height: Double) {
        self.width = width;
        self.height = height;
    }
}
var rect = Rectangle.init(width: <#T##Double#>, height: <#T##Double#>)
  1. 構(gòu)造函數(shù)與存儲屬性初始化
    構(gòu)造函數(shù)的主要作用就是初始化實例各谚,其中包括存儲屬性和其他屬性的初始化。(在不聲明為可選類型的情況下到千,如果存儲屬性在構(gòu)造函數(shù)中沒有初始化昌渤,在定義的時候也沒有初始化,那么就會發(fā)生編譯錯誤)如下:


    屏幕快照 2017-12-24 下午3.07.19.png

    所以我們在創(chuàng)建一個類或者是結(jié)構(gòu)體的時候憔四,存儲屬性如果沒有初初始化膀息,需要初始化存儲屬性:

class Rectangle {
    let num: Int
    var width: Double = 0.0
    var height: Double
    var name: String?
    
    init() {
        self.num = 5
        self.height = 0.0
        self.name = "haha"
    }   
}

注意:常量類型只能在定義的時候賦值,而在構(gòu)造函數(shù)中了赵,常量類型可以不遵守這個規(guī)則潜支。在別的方法中不行。另外柿汛,如果我們在定義的時候不能確定存儲屬性的值冗酿,可以將其聲明為可選類型。

  1. 使用參數(shù)標簽
    為了增強程序的可讀性苛茂,swift在方法和函數(shù)中可以使用參數(shù)標簽已烤。例如:
class Rectangle {
    var width: Double
    var height: Double
    
    init(W width: Double, H height: Double) {
        self.width = width
        self.height = height
    }
    
}
var rect = Rectangle.init(W: <#T##Double#>, H: <#T##Double#>)
//如果沒有聲明參數(shù)標簽鸠窗,參數(shù)名會直接作為參數(shù)標簽使用
var rect = Rectangle.init(width: <#T##Double#>, height: <#T##Double#>)

一般情況下訪問屬性時self可以省略妓羊,但是局部變量和常量命名與屬性名發(fā)生沖突的時候,屬性前面一定要加上self

  1. 構(gòu)造函數(shù)重載
    swift中的構(gòu)造函數(shù)可以有多個稍计,但是它們的參數(shù)列表不同躁绸,這些構(gòu)造函數(shù)構(gòu)成重載
class Rectangle {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
    init(W width: Double, H height: Double) {
        self.width = width
        self.height = height
    }
}

上面代碼中,兩個構(gòu)造函數(shù)就是重載關系,雖然他們的功能是一樣的净刮,但是他們的參數(shù)列表不同(參數(shù)標簽不同)

構(gòu)造函數(shù)代理

為了減少多個構(gòu)造函數(shù)之間的代碼重復剥哑,在定義構(gòu)造函數(shù)時可以通過調(diào)用其他構(gòu)造函數(shù)來完成實例的部分構(gòu)造過程,這個過程稱之為構(gòu)造函數(shù)代理淹父。構(gòu)造函數(shù)代理在結(jié)構(gòu)體和類中的使用方式不同株婴。

結(jié)構(gòu)體構(gòu)造函數(shù)代理

struct Rectangle {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
    init(W width: Double, H height: Double) {
        self.init(width: width, height: height)
    }
    init() {
        self.init(width: 1.0, height: 2.0)
    }
}

類構(gòu)造函數(shù)代理

由于類有繼承關系,所以類構(gòu)造函數(shù)代理分為橫向代理和向上代理

橫向代理類似于結(jié)構(gòu)體類型構(gòu)造函數(shù)代理暑认,發(fā)生在同一類內(nèi)部困介,這種構(gòu)造函數(shù)稱之為便利構(gòu)造函數(shù)
向上代理發(fā)生在繼承情況下,在子類構(gòu)造過程中要先調(diào)用父類構(gòu)造函數(shù)蘸际,初始化父類的存儲屬性座哩,這種構(gòu)造函數(shù)稱為指定構(gòu)造函數(shù)

橫向代理如下

class Rectangle {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
    convenience init(W width: Double, H height: Double) {
        self.init(width: width, height: height)
    }
    convenience init() {
        self.init(width: 1.0, height: 2.0)
    }
}

convenience表示遍歷構(gòu)造函數(shù),這說明我們定義的構(gòu)造函數(shù)時橫向代理調(diào)用其他構(gòu)造函數(shù)

向上代理

析構(gòu)函數(shù)

與構(gòu)造過程相反粮彤,實例在最后釋放的時候需要清除一些資源根穷,這個過程就是析構(gòu)過程,析構(gòu)過程也會調(diào)用一個特殊的方法 deinit 导坟,成為析構(gòu)函數(shù)屿良。析構(gòu)函數(shù)沒有返回值,也沒有參數(shù)惫周,也不需要參數(shù)的小括號管引,所以不能重載。(析構(gòu)函數(shù)只適用于類闯两,不適用于枚舉和結(jié)構(gòu)體)

class Test {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
    convenience init(W width: Double, H height: Double) {
        self.init(width: width, height: height)
    }
    convenience init() {
        self.init(width: 1.0, height: 2.0)
    }
    deinit {
        print("調(diào)用析構(gòu)函數(shù)")
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褥伴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漾狼,更是在濱河造成了極大的恐慌重慢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逊躁,死亡現(xiàn)場離奇詭異似踱,居然都是意外死亡,警方通過查閱死者的電腦和手機稽煤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門核芽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酵熙,你說我怎么就攤上這事轧简。” “怎么了匾二?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵哮独,是天一觀的道長拳芙。 經(jīng)常有香客問我,道長皮璧,這世上最難降的妖魔是什么舟扎? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮悴务,結(jié)果婚禮上睹限,老公的妹妹穿的比我還像新娘。我一直安慰自己讯檐,他們只是感情好邦泄,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裂垦,像睡著了一般顺囊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蕉拢,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天特碳,我揣著相機與錄音,去河邊找鬼晕换。 笑死午乓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的闸准。 我是一名探鬼主播益愈,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夷家!你這毒婦竟也來了蒸其?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤库快,失蹤者是張志新(化名)和其女友劉穎摸袁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體义屏,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡靠汁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闽铐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝶怔。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兄墅,靈堂內(nèi)的尸體忽然破棺而出踢星,到底是詐尸還是另有隱情,我是刑警寧澤察迟,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布斩狱,位于F島的核電站,受9級特大地震影響扎瓶,放射性物質(zhì)發(fā)生泄漏所踊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一概荷、第九天 我趴在偏房一處隱蔽的房頂上張望秕岛。 院中可真熱鬧,春花似錦误证、人聲如沸继薛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遏考。三九已至,卻和暖如春蓝谨,著一層夾襖步出監(jiān)牢的瞬間灌具,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工譬巫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咖楣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓芦昔,卻偏偏與公主長得像诱贿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咕缎,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容