
結構 (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 |
沒有留言:
張貼留言