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

الشروط والحلقات في Dart

الدرس 4 من 14 · Dart

البرنامج الذكي يتخذ قرارات ويكرر المهام. هل كلمة المرور صحيحة؟ اعرض الشاشة الرئيسية، وإلا اعرض رسالة خطأ. وفي قائمة فيها مئة رسالة؟ اعرض كل واحدة بنفس الطريقة. في هذا الدرس ستتعلم الشروط والحلقات في Dart، ومعها تعبير switch الحديث الذي يجعل الكود أقصر وأوضح.

var score = 72;
if (score >= 90) {
print('ممتاز');
} else if (score >= 50) {
print('ناجح');
} else {
print('راسب');
}
الناتج
ناجح

Dart تفحص الشروط من الأعلى، وتنفّذ أول شرط صحيح ثم تتخطى الباقي. والشرط يجب أن يكون من نوع bool حرفياً: لا تقبل Dart أن تكتب if (score) كما تسمح بعض اللغات الأخرى.

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

var age = 16;
var hasTicket = true;
if (age >= 13 && hasTicket) print('تفضل بالدخول');
الناتج
تفضل بالدخول

عندما يكون جسم الشرط سطراً واحداً، يمكن حذف القوسين المعقوفين كما في المثال، لكن مع الأسطر المتعددة اكتبهما دائماً.

لاختيار قيمة من اثنتين في سطر واحد:

var stock = 0;
print(stock > 0 ? 'متوفر' : 'غير متوفر');
الناتج
غير متوفر

ستستخدمه كثيراً في Flutter، مثل اختيار لون الزر حسب حالته.

عندما تقارن قيمة واحدة بعدة احتمالات، استخدم تعبير switch (من Dart 3). وهو يُرجع قيمة مباشرة:

var day = 'الجمعة';
var message = switch (day) {
'الجمعة' || 'السبت' => 'عطلة نهاية الأسبوع',
'الأحد' => 'أول أيام الدراسة',
_ => 'يوم دراسي عادي',
};
print(message);
الناتج
عطلة نهاية الأسبوع
  • كل سطر: نمط (Pattern) ثم => ثم النتيجة.
  • || تجمع أكثر من قيمة في نمط واحد.
  • الشرطة السفلية _ تعني «أي شيء آخر»، مثل else.

والأنماط ليست قيماً ثابتة فقط، بل يمكن أن تكون مقارنات:

var grade = 85;
var label = switch (grade) {
>= 90 => 'A',
>= 75 => 'B',
_ => 'C',
};
print(label);
الناتج
B

تخيّل تعبير switch مثل آلة فرز البريد: كل رسالة تدخل، فتذهب تلقائياً للصندوق المطابق لعنوانها، ومن لا يطابق أي صندوق يذهب لصندوق «أخرى».

عندما تعرف عدد مرات التكرار:

for (var i = 1; i <= 3; i++) {
print('الدورة $i');
}
الناتج
الدورة 1
الدورة 2
الدورة 3

ثلاثة أجزاء: البداية var i = 1، والشرط i <= 3، والخطوة i++ بعد كل دورة.

للمرور على عناصر قائمة دون عدّاد، وهي الأكثر استخداماً:

var fruits = ['تفاح', 'موز', 'برتقال'];
for (var fruit in fruits) {
print('- $fruit');
}
الناتج
- تفاح
- موز
- برتقال

عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:

var balance = 100;
var days = 0;
while (balance > 0) {
balance -= 30;
days++;
}
print('انتهى الرصيد بعد $days أيام');
الناتج
انتهى الرصيد بعد 4 أيام

وهناك أيضاً do { ... } while (...) التي تُنفَّذ مرة واحدة على الأقل قبل فحص الشرط.

  • break: اخرج من الحلقة فوراً.
  • continue: تخطَّ باقي هذه الدورة وانتقل للتالية.
for (var i = 1; i <= 10; i++) {
if (i % 2 == 0) continue; // تخطَّ الزوجي
if (i > 7) break; // توقف بعد 7
print(i);
}
الناتج
1
3
5
7

تحدٍّ مشهور في مقابلات العمل: اطبع الأرقام من 1 إلى 15، لكن اطبع «Fizz» بدل مضاعفات 3، و«Buzz» بدل مضاعفات 5، و«FizzBuzz» بدل مضاعفات الاثنين معاً:

void main() {
for (var i = 1; i <= 15; i++) {
if (i % 15 == 0) {
print('FizzBuzz');
} else if (i % 3 == 0) {
print('Fizz');
} else if (i % 5 == 0) {
print('Buzz');
} else {
print(i);
}
}
}
الناتج المتوقع
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

فكّر: لماذا وضعنا شرط i % 15 أولاً؟ جرّب نقله للآخر ولاحظ ماذا يحدث عند الرقم 15.

  • ترتيب الشروط: الشرط الأوسع أولاً يبتلع الحالات الأضيق، كما في تحدي FizzBuzz.
  • الحلقة اللانهائية: نسيان تغيير المتغير في while يجعل الشرط صحيحاً للأبد ويتجمد التطبيق.
  • نسيان _ في تعبير switch: إذا لم تغطِّ كل الاحتمالات، يرفض المحرر الكود. أضف _ للحالات الباقية.

سؤال

ما معنى الشرطة السفلية _ في تعبير switch؟

سؤال

أي حلقة هي الأنسب للمرور على كل عناصر قائمة؟

  • if و else if و else للقرارات، والشرط يجب أن يكون bool.
  • المعامل الثلاثي شرط ? أ : ب لاختيار قيمة في سطر واحد.
  • تعبير switch الحديث يُرجع قيمة، ويقبل أنماطاً مثل || و >= 90، و _ للباقي.
  • for بعدّاد، و for-in لعناصر القائمة، و while حسب شرط.
  • break للخروج من الحلقة، و continue لتخطي الدورة الحالية.