در کنار آموزش کاتلین، در این مقاله به بررسی آموزش کامل کار با حلقه for در کاتلین به زبان ساده پرداخته شده است. با دانشجویار همراه باشید.

حلقه‌ی if در کاتلین

قبل از اینکه به توضیح حلقه for در کاتلین بپردازیم، در مورد  حلقه‌ی if در کاتلین صحبت می‌کنیم. در زبان کاتلین، if یک عبارت شرطی بوده و یک مقدار را برمی‌گرداند. لذا هیچ‌گونه عملگر سه‌ورودی (condition ? then : else) وجود ندارد.

var max = a
if (a < b) max = b

// With else
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// As expression
val max = if (a > b) a else b

آموزش کامل کار با حلقه for در کاتلین به زبان ساده

شاخه‌هایی از شاخه‌های if می‌توانند یک بلوک را تشکیل دهند. در این مثال، آخرین عبارت برابر با مقدار بلوک است:

val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

اگر به‌عنوان مثال از if به عنوان یک عبارت استفاده می‌کنید، برای برداشتن مقدار آن و یا تعیین مقدار به متغیر‌های آن، استفاده از شاخه‌ی else ضروری است.

نکته
چناچه علاقه‌مند به یادگیری زبان برنامه نویسی کاتلین هستید، می توانید به دوره جامع آموزش زبان برنامه نویسی کاتلین مراجعه فرمایید.

عبارت when در کاتلین

When یک عبارت شرطی را با چندین شاخه تعریف می‌کند. این دستور مانند switch در زبان‌های خانواده‌ی C است. نمونه‌ای ساده از این دستور به شکل زیر است:

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}

when ورودی خود را با تمامی شاخه‌های دستور مقایسه می‌کند، تا اینکه یکی از شرایط شاخه‌ها ارضا شود.

When می‌تواند هم به‌‌عنوان یک عبارت و هم به‌عنوان یک شرط بیان شود. اگر به‌عنوان یک شرط استفاده شود، مقدار اولین شاخه‌ای که شرط را ارضا می‌کند به عنوان خروجی when انتخاب می‌شود. اما اگر when به‌عنوان عبارت استفاده شود، از مقدار شاخه‌ها صرف‌نظر می‌شود. درست همانند دستور If هر یک از شاخه‌ها می‌تواند یک بلوک باشد، و مقدار نهایی آن، مقدار آخرین عبارت موجود در بلوک است.

شاخه‌ی else در صورتی که هیچ‌یک از دیگر شاخه‌ها شرایط دستور if را ارضا نکند، استفاده می‌شود. اگر از دستور when استفاده شود، آوردن شاخه‌ی else ضروری است، مگر اینکه تمامی حالات ممکن در شرایط شاخه‌ها پوشش داده‌شود.

نکته
پشنهاد

برای ترکیب یک خروجی مشترک برای کیس‌های متعدد، شرایط آنها را در یک خط با استفاده از کاما ترکیب کنید:

when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

شما می‌توانید از عباراتی به دلخواه خود به‌عنوان شرایط شاخه‌ها استفاده کنید:

when (x) {
    parseInt(s) -> print("s encodes x")
    else -> print("s does not encode x")
}

شما همچنین می‌توانید بررسی کنید که یک مقدار در بازه‌ای خاص قرار می‌گیرد یا خیر (با in و !in)

when (x) {
    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}

راهی دیگر برای ساخت شرط در شاخه، بررسی این است که یک مقدار از نوعی خاص هست یا خیر (is و !is).

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

When همچنین می‌تواند به عنوان جایگزین برای زنجیره‌ی if – else if استفاده شود. اگر هیچ‌گونه ورودی برای when وارد نشده، شرایط شاخه‌ها از منطق بولی تبعیت می‌کند و هر شاخه تنها زمانی اجرا می‌شود که شرط آن صحیح باشد.

when {
    x.isOdd() -> print("x is odd")
    y.isEven() -> print("y is even")
    else -> print("x+y is odd")
}

شما می‌توانید موضوع دستور when برای یک متغیر را با دستور زیر استخراج کنید:

fun Request.getBody() =
        when (val response = executeRequest()) {
            is Success -> response.body
            is HttpError -> throw HttpException(response.status)
        }

حلقه for در کاتلین

برای کار با حلقه for در کاتلین، دانستن این نکته ضروری است که حلقه‌ی for در هر چیزی که تکرارشونده معرفی شود، دستوری را تکرار می‌کند. این دستور مانند دستور foreach در زبان‌های خانواده C# است. سینتکس for به شکل زیر است:

for (item in collection) print(item)

بدنه‌ی for می‌تواند به‌صورت یک بلوک باشد.

for (item: Int in ints) {
    // ...
}

همانگونه که قبلا ذکرشد، حلقه‌ی for در هر چیزی که تکرارشونده معرفی شود، دستوری را تکرار می‌کند، به این معنا که:

  • حلقه‌ی for یک تابع iterator() دارد که مقدار iterator<> را برمی‌گرداند.
  • حلقه‌ی for یک تابع next() دارد.
  • حلقه‌ی for یک تابع hasNext() دارد که مقدار Boolean را برمی‌گرداند.

تمامی این سه تابع، تشکیل یک عملگر را می‌دهند.

برای تکرار در محدوده‌ای از اعداد، از عبارات مربوط به محدوده استفاده کنید:

fun main() {

    for (i in 1..3) {

        println(i)
    }

    for (i in 6 downTo 0 step 2) {

        println(i)
    }
}

اگر می‌خواهید تکرار در محدوده‌ی مقادیر یک لیست باشد، می‌توانید از دستور زیر استفاده کنید:

for (i in array.indices) {

    println(array[i])
}
به‌جای تابع بالا، می‌توانید از تابع withIndex نیز استفاده کنید:
for ((index, value) in array.withIndex()) {

    println("the element at $index is $value")
}