دستور when

در کاتلین ساختاری به نام when وجود دارد که به شما اجازه می‌دهد که با توجه به مقدار ثابت یک متغیر چندین انتخاب داشته باشید. دستور when معادل دستور if تو در تو است با این تفاوت که در دستور when متغیر فقط مقادیر ثابتی از اعداد، رشته‌ها و یا کاراکترها را قبول می‌کند. مقادیر ثابت مقادیری هستند که قابل تغیر نیستند. در زیر نحوه استفاده از دستور when آمده است :

when (testVar)
{
  compareVal1 -> code to execute if testVar == compareVa11
  compareVal1 -> code to execute if testVar == compareVa12
  .
  .
  compareVal1 -> code to execute if testVar == compareVa13
  else	    -> code to execute if none of the values above match the testVar
}

ابتدا یک مقدار در متغیر when که در مثال بالا testVar است قرار می‌دهید. این مقدار با هر یک از مقادیر قبل از علامت -> داخل بلوک when مقایسه می‌شود. اگر مقدار متغیر با هر یک از مقادیر موجود برابر بود دستور مقابل علامت -> اجرا خواهد شد. به این نکته توجه کنید که حتی اگر تعداد خط کدهای داخل دستور case از یکی بیشتر باشد نباید از آکولاد استفاده کنیم. دستور when یک بخش else دارد. این دستور در صورتی اجرا می‌شود که مقدار متغیر با هیچ یک از مقادیر موجود در بدنه برابر نباشد. دستور else اختیاری است و اگر از بدنه when حذف شود هیچ اتفاقی نمی‌افتد. مکان این دستور مهم است و باید آن را در پایان دستورات بنویسید. به مثالی در مورد دستور when توجه کنید :

  1: fun main(args: Array<String>)
  2: {
  3:     println("What's your favorite pet?")
  4:     println("[1] Dog")
  5:     println("[2] Cat")
  6:     println("[3] Rabbit")
  7:     println("[4] Turtle")
  8:     println("[5] Fish")
  9:     println("[6] Not in the choices")
 10:     print("Enter your choice: ")
 11: 
 12:     val choice: Int = readLine () !!. toInt ()
 13: 
 14:     when (choice)
 15:     {
 16:         1 -> println("Your favorite pet is Dog.")
 17:         2 -> println("Your favorite pet is Cat.")
 18:         3 -> println("Your favorite pet is Rabbit.")
 19:         4 -> println("Your favorite pet is Turtle.")
 20:         5 -> println("Your favorite pet is Fish.")
 21:         6 -> println("Your favorite pet is not in the choices.")
 22:         else -> println("You don't have a favorite pet.")
 23:     }
 24: }
What's your favorite pet?
[1] Dog
[2] Cat
[3] Rabbit
[4] Turtle
[5] Fish
[6] Not in the choices

Enter your choice: 2
Your favorite pet is Cat.
What's your favorite pet?
[1] Dog
[2] Cat
[3] Rabbit
[4] Turtle
[5] Fish
[6] Not in the choices

Enter your choice: 99
You don't have a favorite pet.

برنامه بالا به شما اجازه انتخاب حیوان مورد علاقه‌تان را می‌دهد. به اسم هر حیوان یک عدد نسبت داده شده است. شما عدد را وارد می‌کنید و این عدد در دستور when با مقادیر خطوط 21-16 مقایسه می‌شود و اگر با هر کدام از آن مقادیر که برابر بود پیغام مناسب نمایش داده خواهد شد. اگر هم با هیچ کدام از مقادیر برابر نبود دستور else اجرا می‌شود. یکی دیگر از ویژگیهای دستور when این است که شما می‌توانید از دو یا چند -> برای نشان داده یک مجموعه کد استفاده کنید. در مثال زیر اگر مقدار number ،1 ،2 یا 3 باشد یک کد اجرا می‌شود:

when (number) 
{
    1, 2, 3 -> println("This code is shared by three values.")
}

به ازای صحت یک شرط می توان دو یا چند دستور را هم اجرا کرد:

when (number)
{
    1 -> println("Your favorite pet is Dog.")
    2 -> {
            println("statment1")
            println("statment2")
         }
    3 -> println("Your favorite pet is Cat.")    
}

مثلا در کد بالا اگر مقدار number برابر 2 باشد، دو دستور اجرا می شود. از عملگر in هم می توان در بدنه when به صورت زیر استفاده کرد:

when (number)
{
    in 1..10 -> println("Number between 1 .. 10")
}

در کد بالا اگر مقدار number عددی بین محدوده 1 تا 10 باشد، دستور چاپ می شود. همانطور که قبلاً ذکر شد دستور when معادل دستور if تو در تو است. برنامه بالا را به صورت زیر نیز می‌توان نوشت :

if (choice == 1)
    println("Your favorite pet is Dog.")
else if (choice == 2)
    println("Your favorite pet is Cat.")
else if (choice == 3)
    println("Your favorite pet is Rabbit.")
else if (choice == 4)
    println("Your favorite pet is Turtle.")
else if (choice == 5)
    println("Your favorite pet is Fish.")
else if (choice == 6)
    println("Your favorite pet is not in the choices.")
else
    println("You don't have a favorite pet.")

کد بالا دقیقاً نتیجه‌ای مانند دستور when دارد.