kotlin學習day10: 列舉和字串模板
Kotlin-列舉
在 Kotlin中,列舉使用關鍵詞enum, enum class對應Java中的enum,Kotlin中,enum 又叫做軟關鍵詞(soft keyword):當它出現在 class 之前時,它就有了特殊的含義。但是你可以在其他地方把它當做常規名字來使用。另一方面,class依然是一個關鍵詞。你依然需要把變數命名為(class關鍵字以外的名
字) clazz 或aClass。像ava那樣,列舉型別並不是一個值的列表:你可以在列舉類中宣告屬性和方法。
宣告一個列舉:
enum class Color(
val r: Int, val g: Int, val b: Int // 1 宣告列舉常量的屬性
) {
RED(255, 0, 0), ORANGE(255, 265, 0), // 2 當每個常量被建立時指定屬性值
YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
INDIGO(75, 0, 130), VIOLET(238, 130, 238); // 3 分號(;)在這裡是必須的
fun rgb() = (r * 256 + g) * 256 + b // 4 在列舉類中定義了一個方法
}
列舉常量使用了跟在常規類中宣告建構函式和屬性同樣的語法。當宣告每一個列舉常量時,需要為常量提供屬性值。注意,這個示例中展示了 Kotlin 語法中唯一一處需要你使用分號的地方:如果你在列舉類中定義了任何方法,(請使用)分號將列舉常量列表從函式定義中分隔開來。
列舉類的簡單使用:
模擬我們專案開發中最常用的一種場景:客戶端和伺服器約定幾種型別,然後不同的型別展示不同的樣式,在Java中,基本都會使用switch語句或者if-else表示式,但在Kotlin中,我們可以使用更加強大的when表示式,例如:根據輸入的color,我們輸出color的名字:
fun getColorName(color: Color) = // 1 直接返回一個when表示式
when (color) { // 2 如果顏色等於列舉常量,返回對應的字串
Color.RED -> "Richard"
Color.ORANGE -> "Of"
Color.YELLOW -> "York"
Color.GREEN -> "Grave"
Color.BLUE -> "Battle"
Color.INDIGO -> "In"
Color.VIOLET -> "Vain"
}
上面這樣使用了列舉常量的完整名稱,指定了Color列舉類名。當然我們也可以直接通過匯入常量值的方式來簡化程式碼:
頂層包匯入:
import com.example.admin.kotlindemo.Color.*
然後就可以通過名字來使用常量:
fun getWarmth(color: Color) = when (color) {
RED, ORANGE, YELLOW -> "warm" // 3 通過名字來使用常量
GREEN -> "neutral"
BLUE, INDIGO, VIOLET -> "cold"
}
注:為什麼我們這裡函式體的定義直接使用了when表示式呢?因為kotlin中 when 是一個返回值的表示式,因此一個有表示式主體的函式可以直接返回when表示式
Kotlin-字串模板
讓我們來回憶一下Android開發中最常出現的一種場景:
假設我們有個User類
public class User {
private int age;
private String name;
private int sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}
TextView要顯示他的基本資訊:
Java我們一般會拼接成字串或者使用格式化形式,例如:
User user = new User();
String sex;
if (user.getSex() == 0) {
sex = "男";
} else {
sex = "女";
}
textView.setText(user.getName() + "的性別是:" + sex);
是不是很麻煩?但是在Kotlin中,我們只需要:
textview.text = "${user.name}的性別是${if(user.sex==0) "男" else "女"}"
以上的示例介紹了叫做字串模板的特性。在程式碼中,我們可以像很多指令碼語言一樣,在字串值中通過在變數名前面放置$
字元來引用區域性變數或者表示式。這相當於Java的字串串拼接,但是更加緊湊和高效。當然,表示式是靜態檢查的。如果嘗試著去應用一個不存在的變數,程式碼不會通過編譯。如果你需要在一個字串中包含 $
符號,你可以使用轉義功能: println(“$x”) ,列印 $x 但不會講 x 解析為變數引用。上面的使用字串模板的時候使用了一個簡單的表示式,並且在雙引號內部嵌套了雙引號,當然也可以僅僅使用表示式或者字串變數。