تخطَّ إلى المحتوى

الشروط في Kotlin: if و when

الدرس 3 من 11 · Kotlin

كل تطبيق يتخذ قرارات طوال الوقت: هل كلمة المرور صحيحة؟ هل الإنترنت متصل؟ هل المنتج متوفر؟ في هذا الدرس ستتعلم أدوات القرار في Kotlin: الشرط if الذي تعرفه من لغات أخرى لكن بقدرة إضافية، والتعبير when الذي سيصبح من أدواتك المفضلة.

val score = 72
if (score >= 90) {
println("ممتاز")
} else if (score >= 50) {
println("ناجح")
} else {
println("راسب")
}
الناتج
ناجح

Kotlin تفحص الشروط من الأعلى، وتنفّذ أول شرط صحيح فقط. والشرط يجب أن يكون من نوع Boolean.

عوامل المقارنة: == و != و > و < و >= و <=. العوامل المنطقية: && (و)، و || (أو)، و ! (ليس):

val age = 16
val hasTicket = true
if (age >= 13 && hasTicket) println("تفضل بالدخول")
الناتج
تفضل بالدخول

هنا تظهر قوة Kotlin: if ليست مجرد أمر، بل تعبير يُرجع قيمة تضعها في متغير مباشرة:

val stock = 0
val status = if (stock > 0) "متوفر" else "غير متوفر"
println(status)
الناتج
غير متوفر

لهذا لا يوجد في Kotlin المعامل الثلاثي ? : الموجود في لغات أخرى، فـ if تقوم بدوره بشكل أوضح. مثال عملي آخر:

val total = 650
val shipping = if (total >= 500) 0 else 40
println("الشحن: $shipping جنيه")
الناتج
الشحن: 0 جنيه

عندما تقارن قيمة واحدة بعدة احتمالات، استخدم when. وهو أقوى وأنظف من سلسلة طويلة من else if:

val day = "الجمعة"
val message = when (day) {
"الجمعة", "السبت" -> "عطلة نهاية الأسبوع"
"الأحد" -> "أول أيام الدراسة"
else -> "يوم دراسي عادي"
}
println(message)
الناتج
عطلة نهاية الأسبوع
  • كل فرع: قيمة (أو عدة قيم بينها فاصلة) ثم السهم -> ثم النتيجة.
  • else لكل ما لم يطابق الفروع السابقة.
  • ومثل if، يمكن أن يُرجع when قيمة نضعها في متغير.

تخيّل when مثل موظف الاستقبال في فندق: ينظر إلى نوع حجزك، فيرسلك إلى الطابق المناسب، ومن ليس له حجز يرسله إلى مكتب الاستعلامات (else).

يمكن أن يكون الفرع مجالاً من القيم باستخدام in:

val temp = 25
when (temp) {
in 0..15 -> println("الجو بارد")
in 16..28 -> println("الجو معتدل")
else -> println("الجو حار")
}
الناتج
الجو معتدل

0..15 تعني كل الأعداد من 0 إلى 15 شاملة الطرفين. وستستخدم هذه المجالات كثيراً مع الحلقات في الدرس القادم.

إذا لم تكتب قيمة بعد when، يصبح كل فرع شرطاً حراً، فيحل محل سلسلة else if كاملة:

val grade = 85
val label = when {
grade >= 90 -> "A"
grade >= 75 -> "B"
else -> "C"
}
println(label)
الناتج
B

هذا الشكل أوضح بكثير من if المتداخلة عندما تكثر الشروط.

اكتب برنامجاً لمطعم يحدد سعر الوجبة حسب حجمها:

  1. متغير size قيمته "صغير" أو "وسط" أو "كبير".
  2. استخدم when ليحدد السعر: 30 أو 45 أو 60، و 0 لأي قيمة أخرى.
  3. استخدم if كتعبير ليضيف 10 جنيهات توصيل إذا كان متغير delivery يساوي true.
  4. اطبع: «سعر الوجبة: … جنيه».

تحدٍّ: اكتب when بدون قيمة يطبع تقييم سرعة الإنترنت: أقل من 5 «بطيء»، ومن 5 إلى 50 «جيد»، وأكثر «ممتاز».

  • نسيان else عند استخدام when كتعبير: إذا كان when يُرجع قيمة، يجب أن يغطي كل الاحتمالات، فيطلب المترجم else.
  • ترتيب الشروط: في when بدون قيمة، يُنفَّذ أول فرع صحيح. لو بدأت بـ grade >= 50 لن يصل أحد إلى «A».
  • استخدام = بدل ==: if (x = 5) خطأ يرفضه المترجم في Kotlin، وهذا جيد لأنه يحميك.

سؤال

ما قيمة result في val result = if (7 > 3) "نعم" else "لا"؟

سؤال

ماذا يعني الفرع in 1..10 -> ... داخل when؟

  • if و else if و else لاتخاذ القرارات، والشرط من نوع Boolean.
  • if في Kotlin تعبير يُرجع قيمة، ولهذا لا يوجد معامل ثلاثي.
  • when يقارن قيمة بعدة فروع، ويقبل قيماً متعددة ومجالات بـ in.
  • when بدون قيمة يحل محل سلسلة else if الطويلة.
  • == تقارن المحتوى، و else مطلوبة عندما يُرجع when قيمة.