#Swift 類別

本教程屬於 Swift 系列教程

類別與結構相似,但也有一些關鍵的差異。

使用以下語法定義類別:

class Dog {

}

在類別內部可以定義儲存屬性:

class Dog {
 var age = 0
}

類別的定義定義了一個型別。要使用此型別創建新實例,可以使用以下語法:

let roger = Dog()

一旦你有了實例,可以使用點語法來訪問其屬性:

let roger = Dog()
roger.age

相同的點語法用於更新屬性值:

roger.age = 9

一個重要的區別是類別是引用型別,而結構(和列舉)是值型別。

這意味著將一個類別實例賦值給另一個變數不會複製該實例。兩個變數指向同一個實例:

class Dog {
 var age = 0
}

let roger = Dog()
let syd = roger

roger.age = 9
//syd.age == 9

這也意味著我們可以使用 let 定義對類別的引用,並且可以更改其屬性,如上面的示例所示。

我們可以創建類別的實例,稱為物件

與結構一樣,類別可以具有屬性、方法等等。

與結構不同的是,我們 必須 定義一個初始化方法來在創建實例時初始化其值:

class Dog {
 var age : Int
 
 init(age: Int) {
 self.age = age
 }
}

let roger = Dog(age: 9)

只有在有初始化方法時,才能聲明屬性而不初始化它們。

請參閱 self 的使用。我們需要它,因為 age 同時是實例屬性和 init(age:) 方法的參數。 self.age 引用了 age 實例屬性。

類別可以有實例方法:屬於類別實例的函數。

class Dog {
 var age = 8
 var name = "Roger"

 func bark() {
 print("\(name): wof!")
 }
}

我們還可以有型別方法

class Dog {
 var age = 8
 var name = "Roger"

 func bark() {
 print("\(name): wof!")
 }
 static func hello() {
 print("Hello I am the Dog struct")
 }
}

Dog.hello() 調用。

類別允許的一個重要特性是繼承。 一個類別可以從另一個類別繼承所有屬性和方法。

假設我們有一個 Animal 類別。每個動物都有一個年齡:

class Animal {
 var age: Int
}

並非每一個動物都有一個名字。狗有一個名字。因此我們可以創建一個從 Animal 繼承的 Dog 類別:

class Dog: Animal {
 var name: String
}

現在我們必須為這兩個類別添加初始化方法。對於 Dog,完成特定於類別的初始化後,我們可以使用 super.init() 來調用父類初始化方法:

class Animal {
 var age: Int
 
 init(age: Int) {
 self.age = age
 }
}

class Dog: Animal {
 var name: String
 
 init(age: Int, name: String) {
 self.name = name
 super.init(age: age)
 }
}

var horse = Animal(age: 8)
var roger = Dog(age: 8, name: "Roger")

Animal 現在是一個超類Dog 是一個子類

關於類別還有很多要說,但這是一個很好的入門。