Structures in Swift

在 Swift 中定義 structure 語法如下,我們定義 3 個常見的 structures:

struct Point {
   var x, y: Double
}

struct Size {
   var width, height: Double
}

struct Rect {
  var origin: Point
  var size: Size
}

定義完,我們就可以使用 structure 了:

var point = Point(x: 0.0, y: 0.0)

var size = Size(width: 640.0, height: 480.0)

var rect = Rect(origin: point, size: size)

可以注意到,我們在定義 structure 時,並沒有宣告 initializer,但為什麼我們可以直接使用 Point(x: 0.0, y: 0.0) 這個 initializer 呢?

這是因為,在 Swift 中,所有的 structures 都會自動產生 memberwise initializer,也就是說,Swift 會幫你自動產生 initializer,而 initializer的參數就是全部的 properties。真是太聰明了呀 (跟 objc 相比)!

小提醒:相反的, class 不會自動產生 initializer 帶有全部參數,想要有參數要自己寫。


此外,如果我們想在 Rect 中定義一個「算面積」的 variable 可以嘛?可以!Swift 中 structure 也可以定義 computed variables

struct Rect {
   var origin: Point
   var size: Size

   var area: Double {
       return size.width * size.height
   }
}

areacomputed variables


接著一定會想問:在 Swift 中的 structure 也可以定義 method 嘛?可以!Swift 中 structure 也可以定義 method,例如:

struct Rect {
   var origin: Point
   var size: Size

   var area: Double {
       return size.width * size.height
   }

   func isBiggerThanRect(other: Rect) -> Bool {
      return self.area > other.area
  }
}

宣告與呼叫方法就跟 class 相同。


既然這樣,就會延伸出另一個問題: 什麼時候用 Structure,什麼時候用 Class ?

下一篇: Structure of Class?