Switch Case

ما هي switch case؟

switch تستخدم لاختبار متغير معيّن مع عدة قيم محتملة، بدل كتابة if else if else متكررة، فتجعل الكود أنظف وأسهل قراءة.

1. البنية الأساسية لـ Switch Case

switch (variable) {
  case value1:
    // كود يتم تنفيذه إذا كانت variable تساوي value1
    break;
  case value2:
    // كود يتم تنفيذه إذا كانت variable تساوي value2
    break;
  default:
    // كود يتم تنفيذه إذا لم تطابق أي حالة
}
Dart

✅ ملاحظة:

  • break ضروري بعد كل حالة حتى يمنع الاستمرار للحالة التالية.
  • default اختياري، يستخدم إذا لم تتطابق أي حالة.

مثال أساسي:

String day = "Monday";

switch (day) {
  case "Monday":
    print("اليوم هو الإثنين");
    break;
  case "Tuesday":
    print("اليوم هو الثلاثاء");
    break;
  default:
    print("يوم آخر");
}
Dart

مثال 2:

void main() {
  int number = 2;

  switch (number) {
    case 1:
      print('الرقم هو 1');
      break;

    case 2:
      print('الرقم هو 2');
      break;

    case 3:
      print('الرقم هو 3');
      break;

    default:
      print('رقم غير معروف');
  }
}
Dart

مثال لاستخدام أكثر من حالة لنفس النتيجة:

void main() {
  String letter = 'A';

  switch (letter) {
    case 'A':
    case 'a':
      print('الحرف هو A أو a');
      break;
    case 'B':
    case 'b':
      print('الحرف هو B أو b');
      break;
    default:
      print('حرف آخر');
  }
}
Dart

المثال 1: فصول السنة

int month = 3;

switch (month) {
  case 12:
  case 1:
  case 2:
    print("الشتاء");
    break;
  case 3:
  case 4:
  case 5:
    print("الربيع");
    break;
  case 6:
  case 7:
  case 8:
    print("الصيف");
    break;
  case 9:
  case 10:
  case 11:
    print("الخريف");
    break;
  default:
    print("رقم شهر غير صالح");
}
Dart
2. الفروق المهمة بين if و switch
الميزةif-elseswitch-case
الاستخدامشروط معقدة ومتنوعةمقارنة بقيم ثابتة محددة
الأداءأبطأ مع الشروط الكثيرةأسرع مع الحالات الكثيرة
المقارنةتعابير شرطية معقدةمقارنة بقيم مباشرة
التنفيذيفحص الشروط بالتسلسليقفز مباشرة للحالة المطابقة

المثال 1: حاسبة بسيطة

String operation = "+";
double num1 = 10;
double num2 = 5;

switch (operation) {
  case "+":
    print(num1 + num2);
    break;
  case "-":
    print(num1 - num2);
    break;
  case "*":
    print(num1 * num2);
    break;
  case "/":
    print(num1 / num2);
    break;
  default:
    print("عملية غير صالحة");
}
Dart

المثال 2: حجم الملابس

String size = "XL";

switch (size) {
  case "XS":
    print("الحجم صغير جداً");
    break;
  case "S":
    print("الحجم صغير");
    break;
  case "M":
    print("الحجم متوسط");
    break;
  case "L":
    print("الحجم كبير");
    break;
  case "XL":
    print("الحجم كبير جداً");
    break;
  default:
    print("الحجم غير معروف");
}
Dart

المثال 2: تقييم الدرجات

String grade = "B";

switch (grade) {
  case "A":
    print("ممتاز");
    break;
  case "B":
    print("جيد جداً");
    break;
  case "C":
    print("جيد");
    break;
  case "D":
    print("مقبول");
    break;
  case "F":
    print("راسب");
    break;
  default:
    print("تقييم غير معروف");
}
Dart

4. استخدام Switch مع Enum

enum Color { red, green, blue }

void main() {
  Color favorite = Color.blue;

  switch (favorite) {
    case Color.red:
      print("اللون الأحمر");
      break;
    case Color.green:
      print("اللون الأخضر");
      break;
    case Color.blue:
      print("اللون الأزرق"); // سيتم تنفيذ هذا
      break;
  }
}
Dart

5. Switch مع القيم الرقمية

int number = 2;

switch (number) {
  case 1:
    print("واحد");
    break;
  case 2:
    print("اثنان"); // سيتم تنفيذ هذا
    break;
  case 3:
    print("ثلاثة");
    break;
  default:
    print("رقم آخر");
}
Dart

6. Switch مع المدخلات من المستخدم

import 'dart:io';

void main() {
  print("أدخل لونك المفضل (red, green, blue):");
  String? color = stdin.readLineSync();

  switch (color?.toLowerCase()) {
    case "red":
      print("اخترت الأحمر");
      break;
    case "green":
      print("اخترت الأخضر");
      break;
    case "blue":
      print("اخترت الأزرق");
      break;
    default:
      print("لون غير معروف");
  }
}
Dart
7. نصائح مهمة عند استخدام Switch
  1. لا تنسى break:
    • بدونها سيستمر التنفيذ للحالات التالية (تسلسل الحالات)
  2. استخدم default:
  3. للتعامل مع القيم غير المتوقعة
  4. يمكن استخدام continue مع label:
    • للانتقال إلى حالة معينة
  5. المقارنة تكون بـ ==:
    • لا يمكن استخدام شروط معقدة داخل case
  6. يُفضل مع القيم الثابتة:
    • ليس للشروط الديناميكية المعقدة
8. الفرق بين Dart والإصدارات الحديثة (Dart 3.0+)

في Dart 3.0 أصبح Switch أكثر قوة مع:

  • دعم Pattern Matching
  • عدم الحاجة لـ break في بعض الحالات
  • دعم الـ Exhaustiveness checking مع enum

مثال Dart 3.0:

هذا الأسلوب الجديد موجود في Dart 3، ويسمى Switch Expressions أو Switch with Arrow Syntax.

var x = 1;

switch (x) {
  case 1 => print('one'); // => بدل break
  case 2 => print('two');
  default => print('other');
}
Dart
String weather = 'rainy';

switch (weather) {
  case 'sunny' => print('الجو مشمس');
  case 'rainy' => print('الجو ممطر');
  default => print('جو غير معروف');
}
Dart
الفرق بين الأسلوب العادي وهذا الجديد:
  • بدل ما تكتب {} مع break في كل حالة…
  • تستخدم السهم => مباشرة لكتابة النتيجة أو الأمر.
  • الكود يصبح أنظف وأقصر!

ولا تحتاج تكتب break يدويًا — Dart تفهم تلقائيًا أن كل حالة مستقلة.

ملاحظة مهمة:
  • هذه الكتابة تحتاج أن تكون لغة Dart عندك حديثة (Dart 3 أو أحدث).
  • إذا كنت تستخدم Flutter، تأكد أن نسخة Dart حديثة حتى لا يظهر لك أخطاء.
9. متى تستخدم Switch بدلاً من if؟
  1. عندما يكون لديك متغير واحد تختبر قيمته المختلفة
  2. عندما يكون لديك أكثر من 3 حالات ثابتة
  3. عندما تريد كودًا أنظف وأسهل في القراءة
الخلاصة
  • switch مثالي للمقارنة بقيم ثابتة
  • أكثر تنظيماً من if متعددة للحالات الكثيرة
  • أسرع في التنفيذ للحالات الكثيرة
  • يتطلب break إلا في حالات خاصة
  • default مهمة للقيم غير المتوقعة

كيف نستخدم switch لإرجاع قيمة مباشرة؟

void main() {
  var grade = 'A';

  var message = switch (grade) {
    'A' => 'ممتاز',
    'B' => 'جيد جدًا',
    'C' => 'جيد',
    'D' => 'مقبول',
    _ => 'راسب', // _ تعني أي شيء آخر (بدل default)
  };

  print(message);
}
Dart
خلاصة الفرق:
الطريقةبدون تعبيرمع تعبير (switch expression)
تستخدم case و breakنعملا
ترجع قيمة مباشرةلانعم
أقصر وأوضحلانعم