十四
.構造器
1. 構造器用於完成例項的構造過程。這個過程包括為例項中的每個儲存屬性設定初始值和執行必要的準備和初始化任務。
2. swift
的構造器本質上就是乙個或多個名為
init
的函式(不允許使用
func
關鍵字)
3. 構造器的主要作用就是完成例項中每個類、結構體中例項儲存屬性(列舉不能定義例項儲存屬性)的初始化。為例項儲存屬性賦初始值有兩個時機:定義例項儲存屬性時指定初始值;在構造器中為例項儲存屬性指定初始值。
4. 如果程式定義例項儲存屬性時指定了初始值,或者在構造器中為例項儲存屬性分配了初始值,那麼都不會觸發該屬性的屬性觀察者。
5. 構造器的外部形參名與函式的外部形參名是不同的。函式的形參預設是沒有外部形參名的,如果想為函式的形參指定外部形參名,有如下兩種方式:(1
)在區域性形參名前顯式定義乙個外部形參名(2
)在區域性形參名前新增
#字首,讓外部形參名與區域性形參名相同。
6. s
為他預設為構造器的所有字首都新增了外部形參名:外部形參名與區域性形參名相同
----
就像在區域性形參名前新增了
#字首一樣。
7. 如果希望外部形參名與內部形參名不同,
swift
也允許為構造器形參顯式地指定外部形參名。
8. 如果希望取消隱式的外部形參名(不需要任何外部形參名),
swift
允許通過將外部形參名指定為下劃線來取消隱式的外部形參名。
9. 在構造過程中常量屬性是可修改的:與普通常量不同的是:在結構體或類中使用
let宣告的常量可以在構造過程中被修改,
而且允許多次被修改。
這是因為
let宣告的常量表示在它被初始化後不能被重新賦值,但結構體或類的構造器的整個構造過程都屬於對常量執行初始化,因此
swift
允許在構造過程中對
let宣告的常量多次賦值。
10.
如果某個儲存屬性的預設值需要特別的計算或定製,此時程式可通過閉包或全域性函式(不能通過呼叫例項方法)為該屬性指定初始值。每當程式建立該型別的例項時,對應的閉包或者函式就會執行,它們的返回值將作為該儲存屬性的初始值。
11.
用於作為儲存屬性初始值的函式或閉包的返回值型別需要與該屬性的型別匹配。
12.
使用閉包或函式對儲存屬性賦初始值時,不能在閉包中訪問該結構體或類的其他例項儲存屬性(即使它們有初始值),不能使用
self
,也不能呼叫其他例項方法
----
這是因為閉包本身會在構造階段執行,此時該例項的其他部分還沒有完成初始化。
13.
函式的過載同樣適用於構造器(構造器就是一種特殊的函式)當乙個型別中包含多個構造器(構造器必須同名),且多個構造器的形參列表不同(包括形參個數或者形參型別),或者形參的外部形參名不通過時,都可以算是構造器重載。
14.
如果構造器
b中完全包含了構造器
a。對於這種完全包含的情況,可以在定義構造器時,通過
self.init
(實參)呼叫其他構造器來完成例項的部分構造過程,這種方式唄稱為構造器**。
結構體和類的構造器**方式並不同。十五.
可能失敗的構造器
1. 有些時候,列舉、結構體、類的構造器可能不會成功地返回該型別的例項,比如使用者傳入的構造器引數無效,或者對構造器過程所需要的外部資源缺失等等情況,此時,
swift
允許定義
「可能失敗的構造器」
2. 可能失敗的構造器使用
init
?或init
!關鍵字進行定義,在這種構造器的執行體內使用
return nil
來表示構造失敗,該構造器返回了乙個
nil(空值)。其中
init
?構造器返回乙個可選型別的例項,因此程式必須對
init
?構造器返回的例項進行強制解析;而
init
!構造器返回乙個隱式可選型別的例項,因此程式可對
init
!構造器返回例項進行隱式解析。
3. 結構體與可能失敗的構造器
----
舉個栗子:
struct cat
self.name = name
}}
4. 列舉與可能失敗的構造器:由於列舉不允許隨意地建立例項(列舉的例項應該是固定的)因此可能失敗的構造器用處更廣,
這種構造器可根據程式傳入的構造器引數選擇列舉成員,如果對應的構造器引數無法確定對應的列舉成員,則返回
nil。
15.
舉個栗子:
enum season}}
let s1 = season(name : "s")
if s1 != nil
let s2 = season(name : "x")
print(s2 == nil)
從上面可以看出,列舉的
init
!構造器將會根據傳入的引數選擇對應的列舉成員,該構造器並沒有建立新的
season
例項(列舉也不允許隨意地建立例項),該構造器只是根據傳入引數選擇對應的列舉成員,並將該成員賦值給
self
;當傳入
的引數找不到對應的列舉成員時,構造失敗,該構造器返回
nil。
16.
實際上,對於帶由於原始值的列舉,
swift
預設提供了乙個
init
?(rawvalue:)
構造器,如果使用者傳入的原始值能找到對應的列舉成員,該構造器將會返回對應的列舉值;如果使用者傳入的原始值找不到對應的成員,該構造器將會返回
nil,代表構造失敗。
每天學一點Swift 物件導向下 二
二 類的構造和析構 1.通過整合後,子類中不僅有父類中的儲存屬性,還有子類自己的儲存屬性。子類中的所有儲存屬性都必須在構造器中設定初始值,因此類的構造過程會相對比較複雜。2.與構造器相反的是,swift 允許為類 列舉 結構體不允許 定義析構器 在例項臨近銷毀之前,系統會自動呼叫該例項的析構器 例項...
每天學一點Swift 物件導向下 七
十一 使用協議作為型別 1.協議也相當於一種型別,與列舉 結構體 類相比,協議相當於一種抽象的型別,它被徹底抽象成只定義規範,不負責實現。因此定義協議之後,就可以像列舉 結構體 類那樣當作型別來使用,只是協議不能直接用於建立例項,協議可以做如下方面的用途 1 可使用協議宣告變數 2 可使用協議作為函...
每天學一點Swift 物件導向下 十
十九 swift 記憶體管理 1.swift 提供了強大的記憶體管理機制 swift 通過自動引用計數 arc 可以很好地管理物件的 大部分時候,程式無須關心 swift 物件的 但在某些特殊情況下,swift 要求程式設計師進行一些記憶體管理的處理。2.只有引用型別變數所引用的物件才需要使用引用計...