<本文學習郭神《第三行代碼》總結>
擴展函數:在不修改某個類源碼的情況下,仍然可以打開這個類,向這個類添加新的函數。
擴展函數可以讓API更簡潔,更加面向對象。
定義擴展函數的語法結構:
fun ClassName.methodName(param1:Int, param2:Int):Int {
//結構體
return 0
}
例如:一段字符串可能包含字母、數字、特殊字符等字符,現在需要統計字符串中字母的數量,如果按照一般寫法:
object StringUtil {
fun letters(str: String): Int {
var count = 0
for (char in str){
if (char.isLetter()){
count ++
}
}
return count
}
}
這裏定義一個StringUtil的單例類,然後定義一個方法letters,接收一個字符串參數,返回一個整型,使用for循環遍歷,每查出一個字母,count計數加1。
工具類寫好了,那麼現在調用該方法:
val str = "ahufh18294#$$%"
val count = StringUtil.letters(str)
這種是常規寫法,也是最標準的實現思維。
但是使用擴展函數,就會不一樣了,一種更加面向對象的思維方式實現該功能,比如將上述的letters方法添加到String類中。
因爲向String類中添加一個擴展函數,首先要新建一個String.kt 文件。
注意:(1)這裏文件名沒有固定要求,只是爲了方便知道向哪一個類中添加擴展函數,所以建議使用相同的類名。
(2)擴展函數也可以定義在任何一個現有類中。
(3)最好定義成頂層方法,這樣可以進行全局訪問域。
上述代碼就可以修改爲:
fun **String**.letters() : Int{
var count = 0
for (char in this){
if (char.isLetter()){
count ++
}
}
return count
}
這裏是頂層方法。
現在將letters()方法定義爲了String類的擴展函數,那麼函數中就自動擁有了String實例的上下文,因此letters函數就不需要接收一個字符串參數了,而是直接遍歷this即可。
接下來調用該方法就可以直接寫成:
val str = "ahufh18294#$$%".letters()