声明一个枚举类,enum是一个所谓的软关键字,只有出现在class之前才有特殊意义,否则就是一个普通的名字。
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
可以给枚举类声明属性和方法
enum class Color(val r: Int, val g: Int, val b: Int) {
RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0),
GREEN(0, 255, 0), BLUE(0, 0, 255), INDIGO(75, 0, 130),
VIOLET(238, 130, 238);//如果枚举还有函数则用“;”,如果没有用“}”即可
fun rgb() = (r * 256 + g) * 256 + b
}
备注:Kotlin唯一用分号的地方。如果枚举中定义了函数,就要用分号隔开。如果没有函数不用分号。
kotlin中when语句类似java中的switch语句。when和if一样,也是有返回值的表达式。
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
fun main() {
val color = Color.RED
val result = when(color){
Color.RED -> "RED"
Color.ORANGE -> "ORANGE"
Color.YELLOW -> "YELLOW"
Color.GREEN -> "GREEN"
Color.BLUE -> "BLUE"
Color.INDIGO -> "INDIGO"
Color.VIOLET -> "VIOLET"
}
println("when result = $result")//执行结果“when result = RED”
}
和java的switch不同的是,不需要在分支里写break语句,且when语句可以使用任何对象。
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
fun main() {
val c1 = Color.YELLOW
val c2 = Color.RED
val result = when (setOf<Color>(c1, c2)) {
setOf(Color.RED, Color.YELLOW) -> "ORANGE"
setOf(Color.YELLOW, Color.BLUE) -> "GREEN"
setOf(Color.BLUE, Color.VIOLET) -> "INDIGO"
else -> "NA"//必须写else分支
}
println("when result : $result")//执行结果“when result : ORANGE”
}
Kotlin标函数库中有一个setOf函数创建一个Set,Set条目顺序并不重要,只要条目包含一样就相等。
当使用when结构来执行表达式时候,Kotlin编译器会强制检查默认选项。所以when作为非表达式,分支可以没有else分支。但是when作为表达式时,必须提供else分支
interface Animal
class Cat : Animal
class Dog : Animal
fun test(color: Animal) {
when (color) {
is Cat -> "cat"
is Dog -> "dog"
// else -> "else"//when作为函数体而非表达式,不需要else
}
}
interface Animal
class Cat : Animal
class Dog : Animal
fun test(color: Animal) =
when (color) {
is Cat -> "cat"
is Dog -> "dog"
else -> "else"//when作为函数返回时,必须需要else
}
上面带参数的when语句其实性能很差,每个分支都要创建set对象,可以用不带参数的when语句优化
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
fun main() {
val c1 = Color.YELLOW
val c2 = Color.RED
val result = when {
(c1 == Color.RED && c2 == Color.YELLOW)
|| (c1 == Color.YELLOW && c2 == Color.RED) -> "ORANGE"
(c1 == Color.YELLOW && c2 == Color.BLUE)
|| (c1 == Color.BLUE && c2 == Color.YELLOW) -> "ORANGE"
(c1 == Color.BLUE && c2 == Color.VIOLET)
|| (c1 == Color.VIOLET && c2 == Color.BLUE) -> "ORANGE"
else -> "NA"
}
println("no args when result : $result")//执行结果“no args when result : ORANGE”
}
Kotlin中"is"相当于Java中的instanceOf,Kotlin中as相当于Java中的强转。Kotlin不同Java的是不需要强转,编译器会帮我们完成。如果你已经检查了一个变量是某种类型,后面就不需要类型转换了,我们把这种行为称为智能转换
interface Animal
class Cat(var color: String) : Animal
class Dog(var name: String, var age: Int) : Animal
fun test(animal: Animal) {
if (animal is Cat) {
val cat = animal as Cat//显示的强转
println(cat.color)
}
else if (animal is Dog)
println(animal.age)//智能的转换
else println("NA")
}
fun main() {
test(Cat("RED"))//执行结果“RED”
}