實例方法是屬于某個特定類、結構體或者枚舉類型實例的方法。實例方法提供訪問和修改實例屬性的方法或提供與實例目的相關的功能,并以此來支撐實例的功能。實例方法的語法與函數(shù)完全一致,詳情參見函數(shù)。
實例方法要寫在它所屬的類型的前后大括號之間。實例方法能夠隱式訪問它所屬類型的所有的其他實例方法和屬性。實例方法只能被它所屬的類的某個特定實例調(diào)用。實例方法不能脫離于現(xiàn)存的實例而被調(diào)用。
下面的例子,定義一個很簡單的類Counter,Counter能被用來對一個動作發(fā)生的次數(shù)進行計數(shù):
class Counter {
var count = 0
func increment() {
count++
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
Counter類定義了三個實例方法:
increment讓計數(shù)器按一遞增;incrementBy(amount: Int)讓計數(shù)器按一個指定的整數(shù)值遞增;reset將計數(shù)器重置為0。
Counter這個類還聲明了一個可變屬性count,用它來保持對當前計數(shù)器值的追蹤。
和調(diào)用屬性一樣,用點語法(dot syntax)調(diào)用實例方法:
let counter = Counter()
// 初始計數(shù)值是0
counter.increment()
// 計數(shù)值現(xiàn)在是1
counter.incrementBy(5)
// 計數(shù)值現(xiàn)在是6
counter.reset()
// 計數(shù)值現(xiàn)在是0
函數(shù)參數(shù)可以同時有一個局部名稱(在函數(shù)體內(nèi)部使用)和一個外部名稱(在調(diào)用函數(shù)時使用),詳情參見函數(shù)的外部參數(shù)名。方法參數(shù)也一樣(因為方法就是函數(shù),只是這個函數(shù)與某個類型相關聯(lián)了)。但是,方法和函數(shù)的局部名稱和外部名稱的默認行為是不一樣的。
Swift 中的方法和 Objective-C 中的方法極其相似。像在 Objective-C 中一樣,Swift 中方法的名稱通常用一個介詞指向方法的第一個參數(shù),比如:with,for,by等等。前面的Counter類的例子中incrementBy方法就是這樣的。介詞的使用讓方法在被調(diào)用時能像一個句子一樣被解讀。和函數(shù)參數(shù)不同,對于方法的參數(shù),Swift 使用不同的默認處理方式,這可以讓方法命名規(guī)范更容易寫。
具體來說,Swift 默認僅給方法的第一個參數(shù)名稱一個局部參數(shù)名稱;默認同時給第二個和后續(xù)的參數(shù)名稱局部參數(shù)名稱和外部參數(shù)名稱。這個約定與典型的命名和調(diào)用約定相適應,與你在寫 Objective-C 的方法時很相似。這個約定還讓表達式方法在調(diào)用時不需要再限定參數(shù)名稱。
看看下面這個Counter的另一個版本(它定義了一個更復雜的incrementBy方法):
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
incrementBy方法有兩個參數(shù): amount和numberOfTimes。默認情況下,Swift 只把amount當作一個局部名稱,但是把numberOfTimes即看作局部名稱又看作外部名稱。下面調(diào)用這個方法:
let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)
// counter value is now 15
你不必為第一個參數(shù)值再定義一個外部變量名:因為從函數(shù)名incrementBy已經(jīng)能很清楚地看出它的作用。但是第二個參數(shù),就要被一個外部參數(shù)名稱所限定,以便在方法被調(diào)用時明確它的作用。
這種默認的行為能夠有效的處理方法(method),類似于在參數(shù)numberOfTimes前寫一個井號(#):
func incrementBy(amount: Int, #numberOfTimes: Int) {
count += amount * numberOfTimes
}
這種默認行為使上面代碼意味著:在 Swift 中定義方法使用了與 Objective-C 同樣的語法風格,并且方法將以自然表達式的方式被調(diào)用。
有時為方法的第一個參數(shù)提供一個外部參數(shù)名稱是非常有用的,盡管這不是默認的行為。你可以自己添加一個顯式的外部名稱或者用一個井號(#)作為第一個參數(shù)的前綴來把這個局部名稱當作外部名稱使用。
相反,如果你不想為方法的第二個及后續(xù)的參數(shù)提供一個外部名稱,可以通過使用下劃線(_)作為該參數(shù)的顯式外部名稱,這樣做將覆蓋默認行為。
self屬性(The self Property)
類型的每一個實例都有一個隱含屬性叫做self,self完全等同于該實例本身。你可以在一個實例的實例方法中使用這個隱含的self屬性來引用當前實例。
上面例子中的increment方法還可以這樣寫:
上一篇:Swift協(xié)議合成下一篇:Swift方法擴展