擴充擴充可以讓我們給一個已有的類、結構體、枚舉等類型添加新功能,包括屬性和方法,甚至是構造器,下標,支援協議等等。。。
甚至是我們拿不到原始碼的類、結構體、枚舉,我們依然可以給它加擴充。。。
看到這裡的時候,我還有點小激動呢。。。可是淡定下來之後,覺得這TMD就是個大大的飛線,飛線,飛線。。。這讓我們的代碼難以理解全面(總要擔心是不是哪裡還有擴充,我沒讀到的。。誰會不會在哪寫個飛線出來以達到他不可告人的秘密,所以我們不得不在“代碼規範”裡寫:擴充必須緊挨著類的實現寫。可是拿不代碼的類呢?我們還要規定必須給檔案名稱起一個類似xxxxExtensions.swift 或者 xxxxDelegate.swift 這樣的名字。。。為何不讓使用者通過代理模式去做這樣的事情,反而是提供了這樣一個反代碼反人類的特性。。。)
不管怎麼說,既然提供了這樣的東西,還是記錄一下這個奇葩的方式吧。
文法:extension MyClass { //要擴充的屬性,方法,等功能寫在這裡}
extension MyClass: MyProtocol { //協議在後面的筆記裡再說,這裡只是提一下 //要擴充的屬性,方法,等功能寫在這裡}
擴充可以做的事兒:1. 添加計算型屬性和計算型靜態屬性2. 定義執行個體方法和類型方法3. 提供新的構造器4. 定義下標5. 定義和使用新的巢狀型別6. 使一個已有的類型遵守某個協議
之前在寫一個例子的時候,發現 Int沒有toString方法,於是,我們藉助擴充的強大功能,現在可以讓Int有toString方法了:
extension Int {
func toString()->String {
var tmpArray = ["0","1","2","3","4"
,"5","6","7","8","9"]
var tmpNum = self
var tmpString = ""
while tmpNum > 0 {
tmpString = tmpArray[tmpNum % 10] + tmpString
tmpNum /= 10
}
return tmpString
}
}
var myNum:Int = 6234232
println(myNum.toString())
注意:這隻是個玩具(樣本),如果用到項目中的話,請考慮更好的寫法。至於文檔中提到的構造器,下標,mutating方法,巢狀型別,無非都是這樣。。再簡單不過,自己寫著玩就好了。不列了。