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