在上一篇的文章中,有提到屬性(property)這件事情指的就是類別或結構裡面的所包含的變數、常數,而方法(method)就是類別、結構裡面的函式。
而實質上,論及屬性這件事情,有以下這四種的屬性:
以下,將會分別描述這四種屬性的特質:
如上述,在將Room404實體化後,我們便可以針對它的city這個項目來做一些內容性的更動。而這個時候打印出來的Room404的city就被改動了。
然而,上述的這個前提是建立在Room405的宣告是變數(variable)的情況,假若你今天宣稱是常數(constant),那就等著報錯吧,因為常數是無法更改的啊!:
如上述,get會做的事情就是讓值被儲存,所以可以看到右邊列跑出了130,也就是被計算的值。
而set在做的事情則是設置其他屬性的值,如上述,set( )中間傳入了leveup,而在set內部則對HP內部進行了改變,也就是上升一個等級後,它就會增加它的血量,防禦力也如是。(資料來源:Swift起步走、the swift programming language)
不過,關於100Days of Swift中所描述的計算屬性則有一個不一樣的例子:
總之,這個例子主要要談的內容是,我們可以創造一個屬性,這個屬性裡面可以有一些描述的計算,無論是if…else也好或whatever,它可以因此帶入內部的其他屬性進入這個屬性裡被使用,且因此從這個屬性裡輸出這個屬性的結果。
總之,我們在產出了兩個實體Tom & Leo後,我們的Armor就會自己對於其進行計算。
總和上述,didSet的用途,其實主要是就是讓新的屬性能夠被傳進去參數裡面,然後藉由值的傳入去更動整個狀態(我好像大概知道進度條要怎麼寫了XD)
而willSet則是在所有事情發生前,會有一個值被當作類似默認的存在描述。
套用100 Days of Swift的例子:
總之,上面的程式碼會打印出下面這個:
不過,據Paul Hudson認為:willSet是一個很少用的函式。
但不論如何,還是來試一下willSet:
總之,在這個案例中,hp是沒有變化的,因為還沒有敘述如何讓血量減少的功能,或許往後會有機會嘗試。
繼上述談到所謂的屬性後,可以了解struct、class中有屬性也有方法,而方法這個東西,大致在概念上一分爲二:實體方法、型別方法
實體方法(instance method):先需要生成一個特定型別(類別、結構或列舉)的實體,才能使用這個實體裡的方法。
型別方法(type method):屬於特定型別(類別、結構或列舉)本身的方法。
100 Days of Swift-Mutating method的相關描述:
The problem is that when you create the struct Swift has no idea whether you will use it with constants or variables, so by default it takes the safe approach: Swift won’t let you write methods that change properties unless you specifically request it.
翻譯翻譯:當你創建 struct 時,Swift 不知道你是將它與常量還是變量一起使用,所以在默認情況下它將採用一個安全的方法:除非你特別要求,否則 Swift 不會讓你編寫改變屬性的方法。
When you want to change a property inside a method, you need to mark it using the mutating keyword,
所以,當你需要改變一個方法裡面的屬性的時候,你需要標示”Mutating”
Swift起步走的相關描述:
一般情況下,一個值型別(結構或列舉)實體的屬性,不能在它的實體方法中被修改。但如果有特殊需求需要修改屬性,可以使用變異(mutating)這個方法。要使用變異方法,將關鍵字mutating放在方法的func之前就可以了,如下:
我們在這邊使用mutating func ,可以讓原先的屬性內容被改變
或許這裡有更好的例子:
這邊如果用mutating func的話,就會讓someone的內容跟之前的預設去做改變,可能要體會一下。
或是用static func來做也是可行的。
總之,型別方法不需要生成實體,就可以直接呼叫型別方法,因為型別方法是屬於一個特定型別(類別、結構與列舉),而非一個實體。
綜合上述,我們討論到三件事情,一是實體方法的使用,它必須經過實體話,才能以「實體.方法()」的方式來呼叫,而型別方法因為本身的構成是類別、結構裡面含有型別方法,所以只要在外部將「類別.型別方法()」,拿出來使用就可以了。
而變異方法Mutating func則是在實體方法中,假若要在定義過的實體外部進行更動的話,就可以在類別、結構內部先設置一個變異方法,然後在外部套用,就會變成Mutating func所指定的內容。
鐵人賽