Classes

在 Swift 中,定義一個 Class 的語法如下:

class Vehicle {
  // properties
  // methods
  // initializers
}

classproperties, method, initializers,都會在{ } 之中定義且實作。


另外跟 objc 比起來,有兩件事情不用做

  1. 不需要 import "Vehicle.h":因為 Swift 中只有一個檔案,「.h」檔不存在。
  2. 不需要繼承任何 base class:以前在 objc 中,任何 class 需要繼承 NSObject,現在擇不需要,不繼承可以。但是,「要繼承也沒關係」,還是可以寫成:
class Vehicle: NSObject {

}

Properties

class 中定義一個 property:

class Vehicle: NSObject {
   var numberOfWheels = 0
}

有 3 點要注意:

  1. 其寫法就跟之前定義 varaible 一樣。(也可以定義成 Constantlet numberOfWheels = 0)
  2. 不用定義 Accessors (getter/setting) ,Swift 會自動幫你處理好!
  3. 在 Swift 中, properies 有分兩種 Stored Properties, Computed Properties.

Stored Properties

Stored properties,故名思義就是單純用來儲存資料的 properties

class Vehicle: NSObject {
   var numberOfWheels = 0
}

numberOfWheelsvariable stored properties。另外還有 constant stored properties (如果用 let 宣告的話)

Computed Properties

第二種 propertiescomputed properties

class Vehicle: NSObject {
   var numberOfWheels = 0
  
   var description: String {
       get {
           return "\(numberOfWheels) wheels"
       }
   }
}

我們可以定義 computed properties 的型態,透過: String。並且定義回傳值return "\(numberOfWheels) wheels"

此外,因為 computed properties 只需要回傳結果,不需要儲存結果,因此只定義了 get{},讓 computed propertiesreadonly

當然你可以定義 set{}

class Vehicle: NSObject {
   var numberOfWheels = 0
  
   var description: String {
       get {
           return "\(numberOfWheels) wheels"
       }
    set {
    
    }
  }
}

但是在此範例中我們不需要。


既然 descriptionreadonlyproperties,在 Swift 中可以用更簡單的語法:

class Vehicle {
   var numberOfWheels = 0
   var description: String {
       return "\(numberOfWheels) wheels"
   }
}

Initializer Syntax

在 Swift 中初始化一個 class:

class Vehicle {
   var numberOfWheels = 0
   var description: String {
       return "\(numberOfWheels) wheels"
   }
}

let someVehicle = Vehicle()

只需要加上(),不需要 alloc 等,因為 Swift 是 ARC,自動幫你處理好這些問題!


當然你也可以明確的指出 someVehicle 的型態,利用: Vehicle

class Vehicle {
   var numberOfWheels = 0
   var description: String {
       return "\(numberOfWheels) wheels"
   }
}

let someVehicle: Vehicle = Vehicle()

Dot Syntax

在 Swift 中也有跟 objc 一樣的 dot (.) 語法可以用,可以很輕鬆的 取得/修改 properties

let someVehicle = Vehicle()
println(someVehicle.description)
// 0 wheels

someVehicle.numberOfWheels = 2
println(someVehicle.description)
// 2 wheels

Class Inheritance

class 可以被繼承,語法如下:

class Bicycle: Vehicle {

}

在此範例中,我們想要 Bicycle 可以去更改 VehiclenumberOfWheels 的初始值(因為 bicycle 有兩個輪子),因此我們要自己實作 initializer,語法如下:

class Bicycle: Vehicle {
   init() {
    super.init()
    numberOfWheels = 2
   }
}

init(){ } 是 Swift 中的 keyword,每個 class 都會有。當 init 時,第一件要做的事就是呼叫 super.init(),因為 Bicycle 繼承 Vehicle ,因此需要先讓 Vehicle 初始化成功後,才可以使用 numberOfWheels 這些 properties

接著我們就可以建立 Bicycle 物件(instance):

class Bicycle: Vehicle {
   init() {
    super.init()
    numberOfWheels = 2
   }
}

let myBicycle = Bicycle()
println(myBicycle.description)
// 2 wheels

下一篇: Overriding a Property