الحلقات في Swift: for-in و while
تطبيق الصور في هاتفك يعرض آلاف الصور، وتطبيق الرسائل يعرض كل محادثاتك، وكل هذا يتم بالمرور على البيانات واحدة واحدة. الحلقات هي أداة التكرار في البرمجة. وفي Swift تحديداً، صُممت الحلقات لتكون واضحة وآمنة: لا عدّادات يدوية تخطئ فيها، ولا حدود مصفوفات تتجاوزها بسهولة.
for-in مع المجالات
Section titled “for-in مع المجالات”for i in 1...3 { print("الدورة \(i)")}الدورة 1الدورة 2الدورة 31...3 مجال مغلق: من 1 إلى 3 شاملة الطرفين. والمتغير i ثابت في كل دورة، تنشئه Swift تلقائياً.
المجال النصف مفتوح ..< لا يشمل الطرف الأخير، وهو مثالي مع المصفوفات التي يبدأ ترقيمها من صفر:
for i in 0..<3 { print(i)}012وإذا لم تحتج المتغير، ضع مكانه شرطة سفلية:
for _ in 1...3 { print("مرحباً")}المرور على المصفوفات
Section titled “المرور على المصفوفات”let fruits = ["تفاح", "موز", "برتقال"]for fruit in fruits { print("- \(fruit)")}- تفاح- موز- برتقالوإذا احتجت رقم العنصر مع قيمته، استخدم enumerated():
for (index, fruit) in fruits.enumerated() { print("\(index + 1). \(fruit)")}1. تفاح2. موز3. برتقال(index, fruit) تفكك كل عنصر إلى رقمه وقيمته. والرقم يبدأ من صفر، لذلك أضفنا 1 للعرض.
stride: خطوات مخصصة
Section titled “stride: خطوات مخصصة”للقفز بخطوة غير 1، أو للعد التنازلي:
for i in stride(from: 0, through: 10, by: 5) { print(i)}0510for i in stride(from: 3, to: 0, by: -1) { print(i)}print("انطلق!")321انطلق!through: يشمل القيمة الأخيرة، مثل....to: لا يشملها، مثل..<.by: مقدار الخطوة، وسالب للعد التنازلي.
تخيّل stride مثل صعود درج بخطوات واسعة: تحدد من أين تبدأ، وإلى أين تصل، وكم درجة تقفز كل مرة.
while و repeat-while
Section titled “while و repeat-while”عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:
var balance = 100var days = 0while balance > 0 { balance -= 30 days += 1}print("انتهى الرصيد بعد \(days) أيام")انتهى الرصيد بعد 4 أياملاحظ: Swift لا يوجد فيها ++، فنكتب days += 1.
و repeat-while تنفّذ الجسم مرة واحدة على الأقل قبل فحص الشرط، وهي المقابل لـ do-while في لغات أخرى:
var n = 10repeat { print("يُنفذ مرة واحدة على الأقل: \(n)") n += 1} while n < 5يُنفذ مرة واحدة على الأقل: 10break و continue
Section titled “break و continue”for i in 1...10 { if i % 2 == 0 { continue } // تخطَّ الزوجي if i > 7 { break } // توقف بعد 7 print(i)}1357أمثلة عملية
Section titled “أمثلة عملية”let num = 7for i in 1...5 { print("\(num) × \(i) = \(num * i)")}7 × 1 = 77 × 2 = 147 × 3 = 217 × 4 = 287 × 5 = 35var sum = 0for i in 1...100 { sum += i}print(sum)5050جرّب بنفسك
Section titled “جرّب بنفسك”- اطبع الأعداد الزوجية من 2 إلى 20 باستخدام
stride. - اكتب مصفوفة بأسماء 4 أصدقاء، واطبع كل اسم مع رقمه بدءاً من 1.
- اطبع العد التنازلي من 10 إلى 1 ثم «انطلق!».
- تحدٍّ (FizzBuzz): من 1 إلى 15، اطبع «Fizz» لمضاعفات 3، و«Buzz» لمضاعفات 5، و«FizzBuzz» لمضاعفات الاثنين، وجرّب حلها بـ
switch.
أخطاء شائعة
Section titled “أخطاء شائعة”- استخدام ++: غير موجود في Swift. اكتب
+= 1. - مجال تنازلي مثل 5…1: ينهار البرنامج. استخدم
strideأوreversed(). - الخلط بين
...و..<:0...countتتجاوز آخر عنصر في المصفوفة. استخدم0..<count، أو الأفضل المرور على العناصر مباشرة.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ماذا تطبع for i in 1..<4 { print(i) }؟
المجال النصف مفتوح ..< لا يشمل الطرف الأخير، فالقيم 1 و 2 و 3.
سؤال
كيف تطبع العد التنازلي 5، 4، 3، 2، 1 في Swift؟
stride بخطوة سالبة هي الطريقة الصحيحة للعد التنازلي، والمجال 5...1 غير صالح.
الخلاصة
Section titled “الخلاصة”for i in 1...3مجال شامل، و0..<3بدون الطرف الأخير.for item in arrayللمرور على العناصر، وenumerated()للرقم والقيمة معاً.stride(from:through:by:)وstride(from:to:by:)للخطوات المخصصة والعد التنازلي.whileحسب شرط، وrepeat-whileمرة على الأقل، ولا يوجد++.breakللخروج، وcontinueلتخطي الدورة.