函數的一般寫法
fun attack(damage: Int): Unit {
println("damage = " + damage)
}
- 函數需要使用【fun】關鍵字來聲明;
- 參數的書寫格式是
name: type
,和Java的type name
有較大區別; - 返回值書寫和Java有區別。Unit相當于返回“Void”,在Kotlin中,返回值為void是可以省略不寫的。
簡化版:
fun attack(damage: Int) {
println("damage = " + damage)
}
參數支持默認值
fun run(velocity: Float, orientation: String = "北方",
distance: Float = 2000f, accelerate: Float) {
// to run
}
看,多方便啊!我們可以直接給參數設置默認值!并且在調用的時候可以省略這些有默認值的參數。就像這樣:
run(12f, "東方", 3000f, 0.5f) //指定全部參數
run(12f, accelerate = 0.5f) //跳過使用默認值,這時需要指明給那個參數傳值
可變長度的參數
在java中使用String...arg
來表示長度不確定的參數,看看在Kotlin中怎么實現。
fun useSkill(vararg skill: Skill) {
// use skills
}
使用vararg關鍵字修飾變量,表示該類型參數的數量可變。通常因該把它放在參數列表的最后方。看看調用的例子:
var skill1 = Skill("火球術")
var skill2 = Skill("寒冰箭")
var skill3 = Skill("龍息術")
useSkill( skill1, skill2, skill3)
參數范型
使用范型參數和拋去函數的語法,結構上和Java還是有些相似的。
fun <T> studySkill(skill: T):List<T> {
var skillList = ArrayList<T>()
skillList.add(skill)
return skillList
}
主要就是在方法名前加范型聲明。
幾種特殊的函數
局部函數
fun useSkill(vararg skill: Skill) {
// use skills
fun preperSkill(duration: Float): Boolean {
var count = 0
while (count == 3) {
count++
useSkill()
}
return true
}
preperSkill(1f)
}
上面這段代碼展示了如何使用局部函數。在函數中我們任然可以繼續定義函數,這和Python有些相似,只是這里的函數并不能夠作為一個對象。
成員函數
和Java類里的方法差不多性質,主要是為了對比下局部函數。
單表達式函數
像Python一樣,Kotlin支持單表達式函數,就像這樣:
fun adjustExp(exp:Int) :Int= (exp * 1.1).toInt()
簡單的函數我們可以簡化成這樣。當編譯器能夠自動推導類型時,還可以再簡化:
fun adjustExp(exp:Int) = (exp * 1.1).toInt()
就是把返回值類型省略。
擴展函數
Kotlin令人著迷的一個地方絕對包含了擴展函數。這個特性使得我們能夠動態的為一個類擴展新功能,而無需繼承重寫。來看看怎么回事吧。
fun TextView.handleText(text: String) {
if (text.length > 7) {
var newText = text.substring(0, 7) + "..."
setText(newText)
//注意,這里相當于直接在TextView里哦!
}
}
上面這個函數,是我給TextView擴展的一個功能!是的你沒有聽錯!見證奇跡吧!
tv_test.handleText("CoorChice為帥而生!")
當函數寫好后,你會發現,TextView已經擁有這個函數了!
一個類的擴展方法可以在編寫它的地方使用,出了這個范圍就不行了。但如果把擴展方法寫在方法文件中,通過import導入后,可以導入的文件中使用。Amazing!
++注意:在Kotlin中,一個函數就可以作為一個文件!++ 你不必為了書寫一個函數而專門創建一個類。事實上,你可以把公共函數寫到一個文件中,而不用專門創建一個類似于AppUtils之類的類。