方法是與某些特定類型相關(guān)聯(lián)的函數(shù)豹休。
結(jié)構(gòu)體和枚舉能夠定義方法是 Swift 與 C/Objective-C 的主要區(qū)別之一桨吊。
方法的局部參數(shù)名稱和外部參數(shù)名稱 (Local and External Parameter Names for Methods)
Swift 中的方法和 Objective-C 中的方法極其相似。像在 Objective-C 中一樣医窿,Swift 中方法的名稱通常用一個介詞指向方法的第一個參數(shù)炊林,比如:with
卷要,for
,by
等等僧叉。介詞的使用讓方法在被調(diào)用時能像一個句子一樣被解讀。
具體來說隘道,Swift 默認(rèn)僅給方法的第一個參數(shù)名稱一個局部參數(shù)名稱;默認(rèn)同時給第二個和后續(xù)的參數(shù)名稱局部參數(shù)名稱和外部參數(shù)名稱谭梗。這個約定與典型的命名和調(diào)用約定相適應(yīng),與你在寫 Objective-C 的方法時很相似激捏。這個約定還讓富于表達(dá)性的方法在調(diào)用時不需要再限定參數(shù)名稱。
self 屬性(The self Property)
In practice, you don't need to write self
in your code very often.If you don't explictly write self,Swift assumes that you are referring to a property or method of the current instance whenever you use a known property or method name within a method.
The main exception to this rule occurs then a parameter name for an instance method has the same name as a property of that instance.In this situation, the parameter name takes precedence,and it becomes necessary to refer to the proterty in a more qualified way.You use the self
property to distinguish between the parameter name and the property name.
在實例方法中修改值類型(Modifying Value Types from Within Instance Methods)
結(jié)構(gòu)體和枚舉是值類型闰蛔。一般情況下图柏,值類型的屬性不能在它的實例方法中被修改。
但是难咕,如果你確實需要在某個特定的方法中修改結(jié)構(gòu)體或者枚舉的屬性距辆,你可以選擇變異(mutating)
這個方法余佃,然后方法就可以從方法內(nèi)部改變它的屬性跨算;并且它做的任何改變在方法結(jié)束時還會保留在原始結(jié)構(gòu)中。方法還可以給它隱含的self
屬性賦值一個全新的實例步势,這個新實例在方法結(jié)束后將替換原來的實例背犯。
注意,不能在結(jié)構(gòu)體類型的常量上調(diào)用可變方法漠魏,因為其屬性不能被改變,即使屬性是變量屬性
枚舉的可變方法可以把self
設(shè)置為同一枚舉類型中不同的成員:
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 現(xiàn)在等于 .High
ovenLight.next()
// ovenLight 現(xiàn)在等于 .Off
類型方法 (Type Methods)
實例方法是被類型的某個實例調(diào)用的方法哪自。你也可以定義類型本身調(diào)用的方法禁熏,這種方法就叫做類型方法。聲明結(jié)構(gòu)體和枚舉的類型方法瞧毙,在方法的func
關(guān)鍵字之前加上關(guān)鍵字static
寄症。類可能會用關(guān)鍵字class
來允許子類重寫父類的方法實現(xiàn)矩动。
在類型方法的方法體(body)中,self
指向這個類型本身剪决,而不是類型的某個實例檀训。這意味著你可以用self
來消除類型屬性和類型方法參數(shù)之間的歧義(類似于我們在前面處理實例屬性和實例方法參數(shù)時做的那樣)。