結構 (structure) 與類別 (class) 有很多地方類似
像是
- 定義屬性 (property) 與方法 (method) 。
- 定義下標 (subscript) 。
- 定義建構子 (initializer) 。
- 定義延伸 (extension) 。
- 套用協定 (property) 。
下標用關鍵字 (keyword) subscript 定義,這可讓該型態編成集合型態,用索引值存取成員。
延伸用關鍵字 extension 定義,可替特定型態擴充功能。
協定用關鍵字 protocol 定義,用以宣告屬性跟方法。
類別比結構多了以下的功能
- 有繼承 (inheritance) 機制,子類別 (subclass) 能夠以父類別 (superclass) 擴充。
- 型態檢驗機制 (type casting) 。
- 定義解構子 (deinitializer) 。
- 參考計數機制 (reference counting) 。
簡言之,結構屬於一種數值型態 (value type) ,也就是說當結構建立實體物件 (object) 後,經由指派運算子 (assignment operator) 傳遞給另一個變數 (variable) 之時,所傳遞的是該物件的拷貝,例如
struct AStruct { |
var a = 1 |
var b = 2 |
} |
var sd1 = AStruct() |
var sd2 = sd1 |
sd1.a = 33 |
sd2 |
此例 sd2 只會是 sd1 的拷貝,因此改變 sd1 的屬性值並不會影響到 sd2 。輸入到 Playground ,結果如下
然而類別是參考型態 (reference type) ,上例改成用類別來寫,如下
class BClass { |
var a = 3 |
var b = 4 |
} |
var cd1 = BClass() |
var cd2 = cd1 |
cd1.a = 33 |
cd2 |
這裡改變 cd1 的屬性值,連帶 cd2 的屬性值也會改變。輸入到 Playground ,結果如下
至於什麼時候該用結構,什麼時候又該用類別呢?端視需要而定。倒是使用類別需要考慮參考計數的問題,下一個單元我們繼續討論 ARC ,也就是自動參考計數 (automatic reference counting)。
中英文術語對照
結構 | structure |
類別 | class |
屬性 | property |
方法 | method |
下標 | subscript |
建構子 | initializer |
延伸 | extension |
協定 | property |
關鍵字 | keyword |
繼承 | inheritance |
子類別 | subclass |
父類別 | superclass |
型態檢驗機制 | type casting |
解構子 | deinitializer |
參考計數機制 | reference counting |
數值型態 | value type |
物件 | object |
指派運算子 | assignment operator |
變數 | variable |
參考型態 | reference type |
自動參考計數 | automatic reference counting |
沒有留言:
張貼留言