方法是關聯了特定類型的函數。類,結構體以及枚舉都能定義實例方法,方法封裝了給定類型特定的任務和功能。類,結構體和枚舉同樣可以定義類型方法,這是與類型本身關聯的方法。類型方法與Objective-C中的類方法相似。
事實上在 結構體和枚舉中定義方法是 Swift 語言與 C 語言和 Objective-C 的主要區別。在 Objective-C 中,類是 唯一能定義方法的類型。但是在 Swift ,你可以選擇無論類,結構體還是方法,它們都擁有強大的靈活性來在你 創建的類型中定義方法。
一、實例方法
實例方法是屬於特定類實例、結構體實力老或者枚舉實例的函數。
實例方法與函數的語法完全相同。
實例方法默認可以訪問同類下所有其他實例方法和屬 性。實例方法只能在類型的具體實例裏被調用。它不能在獨立於實例而被調用。
1、self屬性
每一個類的實例都隱含一個叫做 self的屬性,它完完全全與實例本身相等。你可以使用 self屬性來在當前實例當中調用它自身的方法。
實際上,你不需要經常在代碼中寫 self。
1 struct Point {
2 var x = 0.0, y = 0.0
3 func isToTheRightOf(x: Double) -> Bool {
4 return self.x > x
5 }
6 }
除去 self 前綴,Swift 將會假定兩個 x 都是叫做 x 的方法形式參數。
2、在實例方法中修改值類型
結構體和枚舉是值類型。默認情況下,值類型屬性不能被自身的實例方法修改。
總之,如果你需要在特定的方法中修改結構體或者枚舉的屬性,你可以選擇將這個方法異變。然後這個方法就可 以在方法中異變(嗯,改變)它的屬性了,並且任何改變在方法結束的時候都會寫入到原始的結構體中。方法同 樣可以指定一個全新的實例給它隱含的 self屬性,並且這個新的實例將會在方法結束的時候替換掉現存的這個實 例。
你可以選擇在 func關鍵字前放一個 mutating關鍵字來使用這個行爲:
1 struct Point {
2 var x = 0.0, y = 0.0
3 mutating func moveBy(x deltaX: Double, y deltaY: Double) {
4 x += deltaX
5 y += deltaY
6 }
7 }
8 var somePoint = Point(x: 1.0, y: 1.0)
9 somePoint.moveBy(x: 2.0, y: 3.0)
10 print("The point is now at (\(somePoint.x), \(somePoint.y))")
11 // prints "The point is now at (3.0, 4.0)"
3、在異變方法裏指定自身
1 struct Point {
2 var x = 0.0, y = 0.0
3 mutating func moveBy(x deltaX: Double, y deltaY: Double) {
4 self = Point(x: x + deltaX, y: y + deltaY)
5 }
6 }
這次的異變方法 moveBy(x:y:)創建了一個 x和 y設置在目的座標的全新的結構體。調用這個版本的方法和的結果 會和之前那個完全一樣。
枚舉的異變方法可以設置隱含的 self屬性爲相同枚舉裏的不同成員:
1 enum TriStateSwitch {
2 case off, low, high
3 mutating func next() {
4 switch self {
5 case .off:
6 self = .low
7 case .low:
8 self = .high
9 case .high:
10 self = .off
11 }
12 }
13 }
14 var ovenLight = TriStateSwitch.low
15 ovenLight.next()
16 // ovenLight is now equal to .high
17 ovenLight.next()
18 // ovenLight is now equal to .off
這個栗子定義了一個三種開關狀態的枚舉。每次調用 next()方法時,這個開關就會在三種不同的電力狀態( Off , low和 high)下切換。
二、類型方法
定義在類型本身調用的方法,被稱爲類型方法
你可以通過在 func關鍵字之前使用 static關鍵字來明確一個類型方法。類同樣可以使用 class關鍵字來允許子類重寫父類對類型方法的實現。
注意:在 Objective-C 中,你只能在 Objective-C 的類中定義類級別的方法。但是在 Swift 裏,你可以在所有的類裏定義類級別的方法,還有結構體和枚舉。每一個類方法都能夠對它自身的類範圍顯式生效。
類型方法和實例方法一樣使用點語法調用。不過,你得在類上調用類型方法,而不是這個類的實例