Kotlin 的基礎語法
在 Kotlin 初體驗 中示範了一個簡單的 Kotlin 寫出來的 App, 接下來還是要先了解一下 Kotlin 基礎語法, 才能繼續走下去。
如果你想要測試一下編譯後的結果, 可以直接上官網有線上編譯器可以直接操作。
基本型態
如果你要宣告一個整數變數, 可以這樣宣告。
var i:Int = 0
如果你之前有學過 Java 很容易可以推斷出其他基本型態的寫法。
Int
、Long
、Double
、Float
、String
、Boolean
、Char
跟 Java 的差別就是第一個字是大寫。
在 Kotlin 裡面, 其實型別是會自動判斷的, 也就是說你可以不用宣告後面的型態。
var i = 1
var s = "aaa"
val d = 1.0
var 與 val 的差異
如果你宣告成為 var 的變數, 那就代表裡面的值未來可以變化, 反之, 如果你宣告成為 val 代表著未來的這個變數是不能再修改值了
當你宣告成 var 之後是不能再改變變數的型態的, 譬如說
var v = 1
v = "sss"
這樣就會發生 Type mismatch 的錯誤。
當你宣告成 val 的時候, 如果一開始沒有初始化變數, 後面只需要確保有進行初始化的動作, 那麼就可以編譯通過。
val tmp
if(size > 0) {
tmp = "success"}else {
tmp = "fail"}
字串
宣告一個字串可以這樣寫
var s1 = "abc"
加入斷行符號
var s2 = "abc\ndef"
print(s2)
輸出會長這樣
abc
def
如果你要把一個變數塞進字串, 則可以使用以下語法。
var s1 = "abc"
print("name is $s1")
輸出結果就會是長這樣
name is abc
如果你要在字串內進行運算, 則是要透過左右大括弧。
var i1 = 1
var i2 = 2
print("sum is ${i1 + i2}")
就會看到結果如下
sum is 3
也可以透過字串內的運算來呼叫方法。
var s1 = "abc"
var s2 = "def"
print("string is ${s1.plus(s2)})
結果如下
string is abcdef
Null機制
Tony Hoare 表示 Null 造成了數十億的損失, 長久以來, 開發者不斷的在程式內檢查 Null, 其實這個檢查本身就造成開發者很大的負擔, 除了程式長得很醜以外, 還會讓程式出現閃退, 開發者面臨崩潰的情況。
除此之外, 還要檢查邊界範圍、是否有空白(trim)等等…。因此通常會用 Android 內建的方法來檢查字串。
TextUtils.isEmpty(str)
在 Kotlin 也提供了相關的方法讓開發者方便使用, 以下是方法跟說明。
isNotEmpty
字串長度不等於 0 為 true 反之為 falseisNotBlank
字串長度為 0 或者字串不是空白為 true 反之為 falseisBlank
字串長度為 0 或者字串是空白字元組成為 true 反之為 falseisEmpty
字串長度為 0 則為 true 反之為 flaseisNullOrBlank
字串是 null 或者字串長度為 0 或全空白為 true 反之為 falseisNullOrEmpty
字串是 null 或者字串長度為 0 為 true 反之為 false
陣列
陣列可以這樣宣告
var array: IntArray = intArrayOf(1, 2, 3)
其實你也不需要宣告型態了, 因為後面都已經把型態標示出來, 就可以節省一些資訊。
var array = intArrayOf(1,2,3)
如同變數你可以宣告各種型態的陣列
var iArray = intArrayOf(1, 2, 3)
var fArray = floatArrayOf(1.0f, 2.0f, 3.0f)
var bArray = booleanArrayOf(true, false, true)
var cArray = charArrayOf('a', 'b', 'c')
你也可以透過建構子傳入想要傳入的個數。
var iArray = IntArray(3)
接著你就可以透過 index 的方式存取數值。
iArray[0] = 4
iArray[1] = 1
iArray[2] = 7
for 迴圈
走訪迴圈
如果你想要走訪整個陣列可以這樣寫。
var iArray = intArrayOf(1, 2, 3)
for(item in iArray){ print("$item ")
}
結果如下
1 2 3
如果你想要宣告字串陣列, 在 Kotlin 裡面就不是 stringArrayOf
這樣宣告了, 你必須透過 arrayOf
這個方法來進行宣告。
var sArray = arrayOf("abc", "def", "ght")
走訪迴圈列印出來
for(item in iArray){ print("$item ")
}
結果如下
abc def ght
for 迴圈取得索引值
for (i in iArray.indices) {
println("${iArray[i]}")
}
array 的 indices 方法就是拿出索引值, 因此透過存取 "${iArray[i]}
來存取到陣列內的值, 那你就會問為什麼要用大括弧來包覆呢? 因為它必須透過 iArray
的 index
去存取值, 所以屬於運算的部分, 因此你必須透過大括弧包覆才能取到值, 否則只會取到 iArray[i]
所對應的位址而已。
for 迴圈範圍運算
除此之外你還可以透過範圍運算來達到指定數量, 例如你想要讓迴圈從1跑到100的累加, 那麼就可以透過範圍運算式達成。
var sum = 0
for(i in 1..100){ sum += i
}
print("sum is $sum")
結果如下
sum is 5050
也可以設定 step 屬性, 也就是說每次前進幾格, 假設我們設定 2+4+6+8+10 的結果。
var sum = 0
for(i in 2..10 step 2){
sum += i
}
print("sum is $sum")
那麼就會得到結果如下
sum is 30
另外還有一個屬性叫做 downTo, 它是用來倒數, 也就是說一開始是 1 到 10, 用了 downTo 屬性就會變成 10 到 1。
for(i in 10 downTo 2 step 2){
print("$i ")
}
結果如下
10 8 6 4 2
還有一個屬性叫做 until, 使用方法如下。
for(item in 1 until 10){
print("$item ")
}
它會除了最後一個以外的元素顯示出來, 結果如下。
1 2 3 4 5 6 7 8 9