В Kotlin нет оператора switch, но есть конструкция when. Он очень похож на переключатель, но в нем гораздо больше возможностей. В простейшей форме вы можете написать это так

val d = Date() 
val c = Calendar.getInstance() 
val day = c.get(Calendar.DAY_OF_WEEK) 
when (day) { 
  1 -> println("Sunday") 
  2 -> println("Monday") 
  3 -> println("Tuesday") 
  4 -> println("Wednesday") 
}

Идея состоит в том, чтобы сопоставить аргумент (переменная day) с ветвями 1, 2, 3 или 4. Тест выполняется сверху вниз (1, затем 2, затем 3, затем 4), и при совпадении выполняется оператор (или блок) справа от тонкой стрелки ->. В отличие от операторов switch, когда совпадение найдено, оно не передается и не каскадируется на следующую ветвь, поэтому вам не нужно помещать оператор break. .

Конструкцию when также можно использовать как выражение, и когда она используется как таковая, каждая ветвь становится возвращаемым значением выражения. См. пример кода ниже.

val d = Date() 
val c = Calendar.getInstance() 
val day = c.get(Calendar.DAY_OF_WEEK) 
var dayOfweek = when (day) { 
  1 -> "Sunday" 
  2 -> "Monday" 
  3 -> "Tuesday" 
  4 -> "Wednesday" 
  else -> "Unknown" 
}

Просто не забудьте включить предложение else, если вы используете его как выражение. Компилятор тщательно проверяет все возможные пути, и он должен быть исчерпывающим, поэтому предложение else становится обязательным.

Вы не ограничены числовыми литералами, вы можете использовать самые разные типы для ветвей, как этот код ниже.

fun main(args: Array<String>) { 
  print("What is the answer to life? ") 
  var response:Int? = readLine()?.toInt()       // (1)  
  val message = when(response) { 
    42 -> "So long, and thanks for the all fish" 
    43, 44, 45 -> "either 43,44 or 45"          // (2)  
    in 46 .. 100 -> "forty six to one hundred"  // (3)  
    else -> "Not what I'm looking for"          // (4)  
 } println(message) 
}

(1) readLine() считывает ввод с консоли. Пока не беспокойтесь о вопросительных знаках, мы вернемся к этому в следующих разделах.

(2) Условия ветвления могут быть объединены запятой

(3) Мы можем проверить, является ли это членом диапазона или коллекции

(4) Предложение else обязательно, когда when используется как выражение

Вы также можете использовать when без аргумента, например

val a = 3 
val b = 2 
val c = 1 
val str = "str" 
when { 
  a > b -> println("a is greater than b") 
  b > c -> println("b is greater than c") 
  b == 2 -> println("b is equal to 2") 
  str == "str" -> println("str is actually equal to $str") 
}

Что фактически делает его эквивалентом структуры if-elseif; хотя выглядит намного чище. Но подождите минутку, снова прочитайте приведенный выше пример кода, и на этот раз внимательно изучите его. Вы заметили, что все условия во всех ветвях должны оцениваться как истинные? Они делают. Однако, если вы запустите код выше, он напечатает только первую ветвь, a > b. Как и в if-elseif, когда одна ветвь оценивается как истина, остальные последующие ветви игнорируются. Их больше не будут оценивать. Лучше взять это на заметку.

Вы также можете использовать оператор is в конструкции when. Если вы сделаете это, вы также получите преимущество смарт-приведения. См. следующий код для примера.

when (arg) { 
  is Int -> println("The square of $arg is ${arg * arg}") 
  is String -> println("Hello" + arg) 
  is IntArray -> println(arg.sum()) 
}

Другой (чуть более сложный) пример использования оператора is в конструкции when.

fun <T> fooBar(arg:T) : T { 
  var retval:T = 0 as T 
  when (arg) { 
    is String -> { 
      retval = "Hello world" as T 
    } 
    is Number -> { 
      retval = 100 as T 
    } 
  } return retval 
}

Вот как вы можете использовать его в приложении для Android.

Первоначально опубликовано на www.workingdev.net.