標籤:ios swift 構造過程
所謂構造過程是指在建立某個執行個體而進行的一系列準備過程。比如為執行個體中的屬性設定初始值和執行其他初始化工作。
構造過程是通過構造器來實現的,其實每個構造器就可以看作是一個函數,只是這個函數是為了執行初始化的。
1、儲存屬性的初始賦值
以類和結構體的執行個體建立為例,在建立類和結構體執行個體的時候,需要給類和街頭題的屬性設定一個預設值,有兩種方法:
1??在定義屬性的時候設定預設值;2??在構造器中賦初值
無論是哪一種方法,他們的值都是被直接設定的,不會觸發任何的屬性觀察器。
那麼什麼是構造器呢?其實在上面的類的繼承中我們已經見過,就是以關鍵字init命名的執行個體方法:
struct Rect { var width : Double init(){ width = 10.0 }}
2、定製化構造過程
剛剛我們使用的是預設建構函式,如果我們需要在建立執行個體的時候用到一些自己輸入的參數什麼的,這個時候我們就需要用到定製化構造過程。
其實定製化的構造過程無非就是將剛剛的無參建構函式變成含參建構函式,其他的不變。
比如看下面的例子:
struct Rect { var width : Double var height : Double = 10.0 init(Square square : Double){ width = square } init(Rectangle rectangle : Double){ width = rectangle } func description (){ println("width is \(width)") }}var graph : Rect = Rect(Square: 10)var graph2 = Rect(Rectangle: 20)graph.description()graph2.description()
這個例子中我們提供了2個建構函式,一個用來建立正方形,一個用來建立長方形,呵呵,顯得有些多餘。。。。
我們在建立執行個體的時候就可以調用不同的建構函式來完成不同的操作。
3、預設構造器
swift將為所有屬性已提供預設值的且自身沒有定義任何構造器的結構體或基類,提供一個預設的構造器,這個預設構造器將簡單的建立一個所有屬性值都設定為預設值的執行個體。
比如下面:
struct Rect { var width : Double = 10.0 var height : Double = 10.0}var graph : Rect = Rect()
這個Rect就沒有構造器,系統會提供一個預設構造器。
除了上面提到的預設構造器,系統還可以用逐一成員構造器來初始化新執行個體裡成員屬性的快捷方法。請參考結構體部分。
4、構造器代理
所謂構造器代理就是構造器可以通過調用其他構造器來完成執行個體的部分構造過程,能夠減少多個構造器之間的代碼重複。
由於值類型(結構體和枚舉)不支援繼承,所以構造器代理的過程相對簡單,因為他們只能代理任務給自身提供的其他構造器。類則不一樣,它可以繼承自其他類,這就是說類喲保證其他所有繼承的屬性在構造時能正確的初始化。
struct Rect { var width : Double = 10.0 var height : Double = 10.0 init (){ } init (h : Double){ self.height = h println("h is \(h)") } init (printH : Double){ self.init(h : printH) }}var graph : Rect = Rect(printH: 3.2)var graph2 = Rect(h: 4.3)
該結構體提供了3個建構函式,一個是空的init,不執行任何操作,一個是傳入h,列印出h的值,一個是傳入pirintH,然後調用init (h : Double)這個建構函式,列印出我輸入的值。
5、類的繼承和構造過程
類中的所有屬性包括繼承自父類的屬性,都必須在構造過程中設定初始值。
類中的構造器有兩種,一個是指定構造器,一個是便利構造器,他們都能確保所有類執行個體中儲存屬性都能獲得初始值。
指定構造器是類中的最主要的構造器,一個指定構造器將初始化類中提供的所有屬性,並根據父類鏈往上調用父類的構造器來實現父類的初始化。每個類都必須擁有一個指定構造器。
便利構造器是輔助構造器,我們可以定義一個便利構造器來調用同一個類中的指定構造器,並為其提供參數和預設值。
下次繼續。
【Swift初見】Swift構造過程