方法 ( method ) 為特定型別 ( 類別、結構或列舉 ) 的函式,可以分為兩種:
・實體方法 ( instance method ):先需要生成一個特定型別 ( 類別、結構或列舉 ) 的實體,才能使用這個實體裡的方法。
・型別方法 ( type method ):屬於特定型別 ( 類別、結構或列舉 ) 本身的方法。
實例方法 ( instance method ) 是屬於一個特定型別 ( 類別、結構或列舉 ) 的實體,可以用來存取和設置實體屬性或是提供實體需要的功能。
實體方法的語法跟使用方式與前面章節提到的函式一樣,使用 func 關鍵字建立,並需要放在這個定義的特定型別 ( 類別、結構或列舉 ) 的大括號 { } 內:
Counter 类定义了三个实例方法:
・increment每次给計數器增加 1
・increment ( by: Int ) 定義一個實體方法,會將變數屬性加上一個傳入的數字
・reset把計數器規零
如果要呼叫方法的話,也是像屬性一樣使用點語法 ( dot syntax ):
每一個實體都有一個內建的隱藏屬性 self,來代表這個實體本身。可以在實體方法中使用 self 來代表這個實體:
實際上,self 不會常使用到,因為在一個方法中使用一個已知的屬性或方法時,Swift 都會將其當做目前這個實體的屬性或方法。
而有一個情況是,當一個實體方法的參數名稱與實體的一個屬性名稱相同時( 像是方法的參數名稱為 count,而屬性也命名為 count ),這時在這個方法中使用 count 的話,都會將其當做參數,除非加上 self 為 self.count,才會當做是實體的屬性。
一般情況下,一個值型別 ( 結構或列舉 ) 實體的屬性,不能在它的實體方法中被修改。但如果有特殊需求需要修改屬性,可以使用變異 ( mutating ) 這個方法。要使用變異方法,將關鍵字 mutating 放在方法的 func 之前就可以了:
這裡要注意一點,上述程式中如果生成實體的是一個常數,則無法使用變異方法來改變屬性,即使屬性是變數也不行。
除了修改屬性,變異方法還可以指派 self 屬性一個全新的實體,方法結束後,會將原先實體替換成這個新的實體:
另外在列舉中使用變異方法,可以把self設置為相同的列舉型別中不同的成員:
型別方法 ( type method ) 為定義在特定型別 ( 類別、結構與列舉 ) 上的方法。不是屬於實體,而是屬於這個型別 ( 類別、結構或列舉 ) 本身的方法,與實體方法一樣使用點語法 ( dot syntax ) 呼叫。
宣告型別方法時需要在 func 前加上關鍵字 static。而以類別來說,還可以將 static 替換成 class 來允許子類別覆寫 ( override ) 父類別的類別方法。
上述程式中可以看到,不用生成實體就可以直接呼叫型別方法,因為型別方法是屬於一個特定型別(類別、結構與列舉)而不是一個實體。