/

swift-classes

#Swift 類別

本教程屬於 Swift 系列教程

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

使用以下語法定義類別:

1
2
3
class Dog {

}

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

1
2
3
class Dog {
var age = 0
}

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

1
let roger = Dog()

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

1
2
let roger = Dog()
roger.age

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

1
roger.age = 9

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

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

1
2
3
4
5
6
7
8
9
class Dog {
var age = 0
}

let roger = Dog()
let syd = roger

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

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

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

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

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

1
2
3
4
5
6
7
8
9
class Dog {
var age : Int

init(age: Int) {
self.age = age
}
}

let roger = Dog(age: 9)

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

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

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

1
2
3
4
5
6
7
8
class Dog {
var age = 8
var name = "Roger"

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

我們還可以有型別方法

1
2
3
4
5
6
7
8
9
10
11
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 類別。每個動物都有一個年齡:

1
2
3
class Animal {
var age: Int
}

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

1
2
3
class Dog: Animal {
var name: String
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 是一個子類

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