方法是與某些特定類型相關聯的函數。
結構體和枚舉能夠定義方法是 Swift 與 C/Objective-C 的主要區別之一。
方法的局部參數名稱和外部參數名稱 (Local and External Parameter Names for Methods)
Swift 中的方法和 Objective-C 中的方法極其相似。像在 Objective-C 中一樣,Swift 中方法的名稱通常用一個介詞指向方法的第一個參數,比如:with
,for
,by
等等。介詞的使用讓方法在被調用時能像一個句子一樣被解讀。
具體來說,Swift 默認僅給方法的第一個參數名稱一個局部參數名稱;默認同時給第二個和后續的參數名稱局部參數名稱和外部參數名稱。這個約定與典型的命名和調用約定相適應,與你在寫 Objective-C 的方法時很相似。這個約定還讓富于表達性的方法在調用時不需要再限定參數名稱。
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)
結構體和枚舉是值類型。一般情況下,值類型的屬性不能在它的實例方法中被修改。
但是,如果你確實需要在某個特定的方法中修改結構體或者枚舉的屬性,你可以選擇變異(mutating)
這個方法,然后方法就可以從方法內部改變它的屬性;并且它做的任何改變在方法結束時還會保留在原始結構中。方法還可以給它隱含的self
屬性賦值一個全新的實例,這個新實例在方法結束后將替換原來的實例。
注意,不能在結構體類型的常量上調用可變方法,因為其屬性不能被改變,即使屬性是變量屬性
枚舉的可變方法可以把self
設置為同一枚舉類型中不同的成員:
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
類型方法 (Type Methods)
實例方法是被類型的某個實例調用的方法。你也可以定義類型本身調用的方法,這種方法就叫做類型方法。聲明結構體和枚舉的類型方法,在方法的func
關鍵字之前加上關鍵字static
。類可能會用關鍵字class
來允許子類重寫父類的方法實現。
在類型方法的方法體(body)中,self
指向這個類型本身,而不是類型的某個實例。這意味著你可以用self
來消除類型屬性和類型方法參數之間的歧義(類似于我們在前面處理實例屬性和實例方法參數時做的那樣)。