الشروط والحلقات في Dart
البرنامج الذكي يتخذ قرارات ويكرر المهام. هل كلمة المرور صحيحة؟ اعرض الشاشة الرئيسية، وإلا اعرض رسالة خطأ. وفي قائمة فيها مئة رسالة؟ اعرض كل واحدة بنفس الطريقة. في هذا الدرس ستتعلم الشروط والحلقات في Dart، ومعها تعبير switch الحديث الذي يجعل الكود أقصر وأوضح.
الشرط if و else
Section titled “الشرط if و else”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('تفضل بالدخول');تفضل بالدخولعندما يكون جسم الشرط سطراً واحداً، يمكن حذف القوسين المعقوفين كما في المثال، لكن مع الأسطر المتعددة اكتبهما دائماً.
المعامل الثلاثي
Section titled “المعامل الثلاثي”لاختيار قيمة من اثنتين في سطر واحد:
var stock = 0;print(stock > 0 ? 'متوفر' : 'غير متوفر');غير متوفرستستخدمه كثيراً في Flutter، مثل اختيار لون الزر حسب حالته.
تعبير switch الحديث
Section titled “تعبير switch الحديث”عندما تقارن قيمة واحدة بعدة احتمالات، استخدم تعبير 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
Section titled “حلقة for”عندما تعرف عدد مرات التكرار:
for (var i = 1; i <= 3; i++) { print('الدورة $i');}الدورة 1الدورة 2الدورة 3ثلاثة أجزاء: البداية var i = 1، والشرط i <= 3، والخطوة i++ بعد كل دورة.
حلقة for-in
Section titled “حلقة for-in”للمرور على عناصر قائمة دون عدّاد، وهي الأكثر استخداماً:
var fruits = ['تفاح', 'موز', 'برتقال'];for (var fruit in fruits) { print('- $fruit');}- تفاح- موز- برتقالحلقة while
Section titled “حلقة while”عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:
var balance = 100;var days = 0;while (balance > 0) { balance -= 30; days++;}print('انتهى الرصيد بعد $days أيام');انتهى الرصيد بعد 4 أياموهناك أيضاً do { ... } while (...) التي تُنفَّذ مرة واحدة على الأقل قبل فحص الشرط.
break و continue
Section titled “break و continue”break: اخرج من الحلقة فوراً.continue: تخطَّ باقي هذه الدورة وانتقل للتالية.
for (var i = 1; i <= 10; i++) { if (i % 2 == 0) continue; // تخطَّ الزوجي if (i > 7) break; // توقف بعد 7 print(i);}1357جرّب بنفسك: تحدي FizzBuzz
Section titled “جرّب بنفسك: تحدي FizzBuzz”تحدٍّ مشهور في مقابلات العمل: اطبع الأرقام من 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); } }}12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzzفكّر: لماذا وضعنا شرط i % 15 أولاً؟ جرّب نقله للآخر ولاحظ ماذا يحدث عند الرقم 15.
أخطاء شائعة
Section titled “أخطاء شائعة”- ترتيب الشروط: الشرط الأوسع أولاً يبتلع الحالات الأضيق، كما في تحدي FizzBuzz.
- الحلقة اللانهائية: نسيان تغيير المتغير في
whileيجعل الشرط صحيحاً للأبد ويتجمد التطبيق. - نسيان _ في تعبير switch: إذا لم تغطِّ كل الاحتمالات، يرفض المحرر الكود. أضف
_للحالات الباقية.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما معنى الشرطة السفلية _ في تعبير switch؟
_ نمط يطابق أي شيء، فيُستخدم كحالة افتراضية مثل else.
سؤال
أي حلقة هي الأنسب للمرور على كل عناصر قائمة؟
for (var item in list) تمر على العناصر مباشرة دون عدّاد أو شرط.
الخلاصة
Section titled “الخلاصة”ifوelse ifوelseللقرارات، والشرط يجب أن يكونbool.- المعامل الثلاثي
شرط ? أ : بلاختيار قيمة في سطر واحد. - تعبير
switchالحديث يُرجع قيمة، ويقبل أنماطاً مثل||و>= 90، و_للباقي. forبعدّاد، وfor-inلعناصر القائمة، وwhileحسب شرط.breakللخروج من الحلقة، وcontinueلتخطي الدورة الحالية.