實例方法
class Counter {
var count = 0
func increment() {
count++
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let counter = Counter()
// 初始計數值是0
counter.increment()
// 計數值現在是1
counter.incrementBy(5)
// 計數值現在是6
counter.reset()
// 計數值現在是0
方法的局部參數名和外部參數名
函數參數可以同時有一個局部名稱(在函數體內部使用)和一個外部名稱(在調用函數時使用)。
方法參數也一樣(因爲方法就是函數,只是這個函數與某個類型相關聯了)。但是,方法和函數的局部名稱和外部名稱的默認行爲是不一樣的。
Swift 默認僅給方法的第一個參數名稱一個局部參數名稱;默認同時給第二個和後續的參數名稱局部參數名稱和外部參數名稱。
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)
// counter value is now 15
你不必爲第一個參數值再定義一個外部變量名:因爲從函數名incrementBy已經能很清楚地看出它的作用。
但是第二個參數,就要被一個外部參數名稱所限定,以便在方法被調用時明確它的作用。
修改方法的外部參數名
有時爲方法的第一個參數提供一個外部參數名稱是非常有用的,儘管這不是默認的行爲。
你可以自己添加一個顯式的外部名稱作爲第一個參數的前綴來把這個局部名稱當作外部名稱使用。
相反,如果你不想爲方法的第二個及後續的參數提供一個外部名稱,可以通過使用下劃線(_)作爲該參數的顯式外部名稱,這樣做將覆蓋默認行爲。
相反,如果你不想爲方法的第二個及後續的參數提供一個外部名稱,可以通過使用下劃線(_)作爲該參數的顯式外部名稱,這樣做將覆蓋默認行爲。
self屬性
self屬性主要用來消除方法參數和實例屬性的歧義,如果不使用self前綴,Swift 就認爲兩次使用的x都指的是名稱爲x的函數參數。
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOfX(x: Double) -> Bool {
return self.x > x
}
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOfX(1.0) {
print("This point is to the right of the line where x == 1.0")
}
// 輸出 "This point is to the right of the line where x == 1.0"(這個點在x等於1.0這條線的右邊)
實例方法中修改值類型
結構體和枚舉是值類型。一般情況下,值類型的屬性不能在它的實例方法中被修改。
但是,如果你確實需要在某個具體的方法中修改結構體或者枚舉的屬性,你可以選擇(mutating)這個方法,然後方法就可以從方法內部改變它的屬性;
但是,如果你確實需要在某個具體的方法中修改結構體或者枚舉的屬性,你可以選擇(mutating)這個方法,然後方法就可以從方法內部改變它的屬性;
並且它做的任何改變在方法結束時還會保留在原始結構中。方法還可以給它隱含的self屬性賦值一個全新的實例,這個新實例在方法結束後將替換原來的實例。
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
// 輸出 "The point is now at (3.0, 4.0)"
Mutating方法中給self賦值
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
enum TriStateSwitch {
case Off, Low, High
mutating func next() {
switch self {
case Off:
self = Low
case Low:
self = High
case High:
self = Off
}
}
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight 現在等於 .High
ovenLight.next()
// ovenLight 現在等於 .Off
類型方法
實例方法是被類型的某個實例調用的方法。你也可以定義類型本身調用的方法,這種方法就叫做類型方法。
class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
}
}
SomeClass.someTypeMethod()