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

الحلقات في Swift: for-in و while

الدرس 4 من 11 · Swift

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

for i in 1...3 {
print("الدورة \(i)")
}
الناتج
الدورة 1
الدورة 2
الدورة 3

1...3 مجال مغلق: من 1 إلى 3 شاملة الطرفين. والمتغير i ثابت في كل دورة، تنشئه Swift تلقائياً.

المجال النصف مفتوح ..< لا يشمل الطرف الأخير، وهو مثالي مع المصفوفات التي يبدأ ترقيمها من صفر:

for i in 0..<3 {
print(i)
}
الناتج
0
1
2

وإذا لم تحتج المتغير، ضع مكانه شرطة سفلية:

for _ in 1...3 {
print("مرحباً")
}
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 للعرض.

للقفز بخطوة غير 1، أو للعد التنازلي:

for i in stride(from: 0, through: 10, by: 5) {
print(i)
}
الناتج
0
5
10
for i in stride(from: 3, to: 0, by: -1) {
print(i)
}
print("انطلق!")
الناتج
3
2
1
انطلق!
  • through: يشمل القيمة الأخيرة، مثل ....
  • to: لا يشملها، مثل ..<.
  • by: مقدار الخطوة، وسالب للعد التنازلي.

تخيّل stride مثل صعود درج بخطوات واسعة: تحدد من أين تبدأ، وإلى أين تصل، وكم درجة تقفز كل مرة.

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

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

لاحظ: Swift لا يوجد فيها ++، فنكتب days += 1.

و repeat-while تنفّذ الجسم مرة واحدة على الأقل قبل فحص الشرط، وهي المقابل لـ do-while في لغات أخرى:

var n = 10
repeat {
print("يُنفذ مرة واحدة على الأقل: \(n)")
n += 1
} while n < 5
الناتج
يُنفذ مرة واحدة على الأقل: 10
for i in 1...10 {
if i % 2 == 0 { continue } // تخطَّ الزوجي
if i > 7 { break } // توقف بعد 7
print(i)
}
الناتج
1
3
5
7
let num = 7
for i in 1...5 {
print("\(num) × \(i) = \(num * i)")
}
الناتج
7 × 1 = 7
7 × 2 = 14
7 × 3 = 21
7 × 4 = 28
7 × 5 = 35
var sum = 0
for i in 1...100 {
sum += i
}
print(sum)
الناتج
5050
  1. اطبع الأعداد الزوجية من 2 إلى 20 باستخدام stride.
  2. اكتب مصفوفة بأسماء 4 أصدقاء، واطبع كل اسم مع رقمه بدءاً من 1.
  3. اطبع العد التنازلي من 10 إلى 1 ثم «انطلق!».
  4. تحدٍّ (FizzBuzz): من 1 إلى 15، اطبع «Fizz» لمضاعفات 3، و«Buzz» لمضاعفات 5، و«FizzBuzz» لمضاعفات الاثنين، وجرّب حلها بـ switch.
  • استخدام ++: غير موجود في Swift. اكتب += 1.
  • مجال تنازلي مثل 5…1: ينهار البرنامج. استخدم stride أو reversed().
  • الخلط بين ... و ..<: 0...count تتجاوز آخر عنصر في المصفوفة. استخدم 0..<count، أو الأفضل المرور على العناصر مباشرة.

سؤال

ماذا تطبع for i in 1..<4 { print(i) }؟

سؤال

كيف تطبع العد التنازلي 5، 4، 3، 2، 1 في Swift؟

  • 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 لتخطي الدورة.