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

when

عبارة/تعبير when when

when بديل Kotlin عن switch — أقوى منها لأنها تدعم النطاقات والأنواع وتعمل كتعبير يُرجع قيمة.

when تقارن قيمة مع عدة حالات مفصولة بـ ->، وتدعم دمج عدة قيم بفاصلة، والنطاقات عبر in، وفحص النوع عبر is. عند استخدامها كتعبير (إسناد نتيجتها لمتغيّر) يجب تغطية كل الحالات، إمّا صراحة أو عبر else.

مع sealed class أو enum، لا حاجة لـ else إن غطّت when كل الحالات الممكنة — الكومبايلر يتحقق من ذلك.

الصياغة

when (قيمة) {
    حالة1 -> // كود
    حالة2, حالة3 -> // كود
    in نطاق -> // كود
    is نوع -> // كود
    else -> // افتراضي
}

📄 مثال

fun classify(x: Any): String = when (x) {
    1, 2, 3 -> "رقم صغير"
    in 4..10 -> "رقم متوسط"
    is String -> "نص طوله ${x.length}"
    else -> "غير معروف"
}

println(classify(2))     // رقم صغير
println(classify(7))     // رقم متوسط
println(classify("hi"))  // نص طوله 2

أهم النقاط

العنصرالوظيفة
حالة ->تنفّذ الكود عند تطابق القيمة تمامًا
حالة1, حالة2 ->تطابق أي من عدة قيم مفصولة بفاصلة
in نطاق ->تطابق عندما تقع القيمة داخل نطاق (range)
is نوع ->تطابق حسب النوع مع smart cast تلقائي
else ->الحالة الافتراضية عند عدم تطابق أي حالة

💡 نصائح عملية

  • استخدم when كتعبير (val x = when {...}) بدل سلسلة if-else طويلة
  • مع sealed class اترك else غائبة عمدًا ليجبرك الكومبايلر على تغطية أي حالة جديدة تُضاف لاحقًا

⚠️ أخطاء شائعة

  • نسيان else عند استخدام when كتعبير مع نوع غير sealed/enum — خطأ ترجمة
  • الاعتماد على السقوط بين الحالات كما في switch القديمة — when لا تملك fall-through أصلًا

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار KOTLIN الكامل بالعربي.