طريقة التعداد (enumerate)
جزء من قسم الأساسيات في رحلة Swift على Coddy — الدرس 70 من 86.
أحيانًا عند التكرار عبر مصفوفة، تحتاج إلى معرفة ليس فقط العنصر، ولكن أيضًا موقعه. بينما يمكنك تتبع الفهرس يدويًا باستخدام متغير عداد، توفر Swift حلاً أكثر أناقة: طريقة enumerated().
عندما تستدعي enumerated() على مصفوفة، فإنها تُرجع تسلسلاً من الصفوف (tuples)، حيث يحتوي كل صف على الفهرس والعنصر:
let colors = ["Red", "Green", "Blue"]
for (index, color) in colors.enumerated() {
print("\(index): \(color)")
}
// 0: Red
// 1: Green
// 2: Blueلاحظ كيف نقوم بتفكيك كل tuple مباشرة داخل الحلقة باستخدام (index, color). هذا يتيح لنا الوصول إلى كلتا القيمتين دون الحاجة إلى أي كود إضافي.
هذا مفيد بشكل خاص عندما تحتاج إلى عرض قوائم مرقمة أو إجراء عمليات تعتمد على موضع العنصر:
let tasks = ["Wake up", "Exercise", "Eat breakfast"]
for (index, task) in tasks.enumerated() {
print("Task \(index + 1): \(task)")
}
// المهمة 1: Wake up
// المهمة 2: Exercise
// المهمة 3: Eat breakfastتُبقي طريقة enumerated() كودك نظيفاً وسهل القراءة مقارنةً بإدارة متغير عداد منفصل يدوياً.
التحدي
سهلاكتب دالة formatWithPositions تأخذ items وتعيد سلسلة نصية منسقة تعرض كل عنصر مع رقم موقعه.
استخدم الطريقة enumerated() للتكرار عبر المصفوفة وبناء سلسلة نصية حيث يتم بادئة كل عنصر برقم موقعه (بدءاً من 1).
المنطق:
- قم بالتكرار عبر المصفوفة باستخدام
enumerated() - لكل عنصر، أنشئ سلسلة نصية بالتنسيق
"position. item"(باستخدام ترقيم يبدأ من 1) - اربط جميع السلاسل النصية المنسقة بحرف سطر جديد (
\n)
المعاملات:
items([String]): مصفوفة من السلاسل النصية لتنسيقها
القيمة المرجعة: سلسلة نصية واحدة مع كل عنصر في سطر خاص به، مسبوقاً برقم موقعه (String). التنسيق: "1. item1\n2. item2\n3. item3"
مثال: إذا كانت items هي ["Apple", "Banana", "Cherry"]، يجب أن تعيد الدالة:
"1. Apple\n2. Banana\n3. Cherry"ملاحظة: إذا كانت المصفوفة فارغة، أعد سلسلة نصية فارغة "".
ورقة مرجعية
تعيد الطريقة enumerated() تسلسلاً من أزواج (tuples) تحتوي على كل من الفهرس والعنصر في المصفوفة:
let colors = ["Red", "Green", "Blue"]
for (index, color) in colors.enumerated() {
print("\(index): \(color)")
}
// 0: Red
// 1: Green
// 2: Blueيتم تفكيك كل زوج (tuple) مباشرة في الحلقة باستخدام صيغة (index, element)، مما يوفر وصولاً إلى كل من الموضع والقيمة.
هذا مفيد لإنشاء قوائم مرقمة عن طريق إضافة 1 إلى الفهرس الذي يبدأ من الصفر:
let tasks = ["Wake up", "Exercise", "Eat breakfast"]
for (index, task) in tasks.enumerated() {
print("Task \(index + 1): \(task)")
}
// Task 1: Wake up
// Task 2: Exercise
// Task 3: Eat breakfastجرّب بنفسك
func formatWithPositions(items: [String]) -> String {
// اكتب الكود هنا
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمةالإسناد المركبمراجعة - عمليات رياضية بسيطةمعاملات المقارنة7أساسيات الإدخال والإخراج
دالة الطباعةتضمين النصوصإدخال ReadLineتحويل الأنواعمراجعة - حتى 120مراجعة - True أو False10الدوال
تعريف دالةالمعاملات والوسائطقيم الإرجاعتسميات الوسائطمراجعة - دالة Sigmaمراجعة - دالة Validationالقيم الافتراضية13التكرار عبر المتسلسلات
التكرار عبر العناصرطريقة التعداد (enumerate)التكرار عبر النصوص - الجزء الأولالتكرار عبر النصوص - الجزء الثاني2المتغيرات
Let مقابل Varتوصيف الأنواع (Type Annotations)الأرقامStringBooleanقواعد التسميةمراجعة - تهيئة المتغيرات5المعاملات - الجزء الثاني
المعاملات المنطقية - الجزء الأولالمعاملات المنطقية - الجزء الثانيمراجعة - المنطق البسيطالمعاملات المنطقية - الجزء الثالثالمعامل الثلاثي (Ternary Operator)8حاسبة تقسيم الفاتورة
رسالة الترحيبالحصول على المدخلات3القيم الاختيارية (Optionals)
ما هي القيم الاختياريةفك القيم باستخدام If Letاستخدام Guard Letمعامل دمج Nilمراجعة - فك القيم بأمان9حلقات التكرار
حلقة For-Inحلقة Whileحلقة Repeat-WhileBreakContinueمراجعة - المضروب (Factorial)النطاقات في حلقات التكرارالحلقات المتداخلةمراجعة - الإدخال الديناميكي (Dynamic Input)