iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
0

https://ithelp.ithome.com.tw/upload/images/20181030/20110801Ypowb98jOk.png

方法 ( method ) 為特定型別 ( 類別、結構或列舉 ) 的函式,可以分為兩種:

・實體方法 ( instance method ):先需要生成一個特定型別 ( 類別、結構或列舉 ) 的實體,才能使用這個實體裡的方法。
・型別方法 ( type method ):屬於特定型別 ( 類別、結構或列舉 ) 本身的方法。

實體方法

實例方法 ( instance method ) 是屬於一個特定型別 ( 類別、結構或列舉 ) 的實體,可以用來存取和設置實體屬性或是提供實體需要的功能。

實體方法的語法跟使用方式與前面章節提到的函式一樣,使用 func 關鍵字建立,並需要放在這個定義的特定型別 ( 類別、結構或列舉 ) 的大括號 { } 內:

https://ithelp.ithome.com.tw/upload/images/20181030/20110801D1mEwn0UYb.png

Counter 类定义了三个实例方法:
・increment每次给計數器增加 1
・increment ( by: Int ) 定義一個實體方法,會將變數屬性加上一個傳入的數字
・reset把計數器規零

如果要呼叫方法的話,也是像屬性一樣使用點語法 ( dot syntax ):

https://ithelp.ithome.com.tw/upload/images/20181030/20110801wUJuX1LfgZ.png

self 屬性

每一個實體都有一個內建的隱藏屬性 self,來代表這個實體本身。可以在實體方法中使用 self 來代表這個實體:

https://ithelp.ithome.com.tw/upload/images/20181030/201108013bx2J5E1wV.png

實際上,self 不會常使用到,因為在一個方法中使用一個已知的屬性或方法時,Swift 都會將其當做目前這個實體的屬性或方法。

而有一個情況是,當一個實體方法的參數名稱與實體的一個屬性名稱相同時( 像是方法的參數名稱為 count,而屬性也命名為 count ),這時在這個方法中使用 count 的話,都會將其當做參數,除非加上 self 為 self.count,才會當做是實體的屬性。

https://ithelp.ithome.com.tw/upload/images/20181030/20110801yP5nSi0mX7.png

在實體方法中修改值型別

一般情況下,一個值型別 ( 結構或列舉 ) 實體的屬性,不能在它的實體方法中被修改。但如果有特殊需求需要修改屬性,可以使用變異 ( mutating ) 這個方法。要使用變異方法,將關鍵字 mutating 放在方法的 func 之前就可以了:

https://ithelp.ithome.com.tw/upload/images/20181030/20110801ntZoiYS9jj.png

這裡要注意一點,上述程式中如果生成實體的是一個常數,則無法使用變異方法來改變屬性,即使屬性是變數也不行。

使用變異方法指派給 self 值

除了修改屬性,變異方法還可以指派 self 屬性一個全新的實體,方法結束後,會將原先實體替換成這個新的實體:

https://ithelp.ithome.com.tw/upload/images/20181030/20110801fvNlbht5X5.png

另外在列舉中使用變異方法,可以把self設置為相同的列舉型別中不同的成員:

https://ithelp.ithome.com.tw/upload/images/20181030/20110801prp7ffnGU1.png

型別方法

型別方法 ( type method ) 為定義在特定型別 ( 類別、結構與列舉 ) 上的方法。不是屬於實體,而是屬於這個型別 ( 類別、結構或列舉 ) 本身的方法,與實體方法一樣使用點語法 ( dot syntax ) 呼叫。

宣告型別方法時需要在 func 前加上關鍵字 static。而以類別來說,還可以將 static 替換成 class 來允許子類別覆寫 ( override ) 父類別的類別方法。

https://ithelp.ithome.com.tw/upload/images/20181030/20110801FLhsQITxbQ.png

上述程式中可以看到,不用生成實體就可以直接呼叫型別方法,因為型別方法是屬於一個特定型別(類別、結構與列舉)而不是一個實體。


上一篇
Swift 4.2 Day-14 Properties
下一篇
Swift 4.2 Day-16 subscript
系列文
菜比八iOS程式開發30天自我挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言