Swift 入門指南 V1.00 - 單元 12 - 比較結構與類別的不同




結構 (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

沒有留言: