flatMap
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 29 من 56.
تُستخدم flatMap في الحالة التي ينتج فيها كل عنصر عدة نتائج. تُرجع الـ closure مصفوفة؛ وتقوم flatMap بدمجها جميعاً في مصفوفة مسطحة واحدة.
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]يمكنك القيام بعمل حقيقي داخل الإغلاق (closure) أيضاً. إن تعيين كل قيمة إلى مصفوفة صغيرة وتسطيح النتيجة في خطوة واحدة هو حالة الاستخدام النموذجية:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]قارن مع map: سينتج عن ذلك [[Int]]، وهي مصفوفة من المصفوفات الصغيرة، والتي ستحتاج إلى خطوة أخرى لتبسيطها. flatMap يدمج هاتين الخطوتين في خطوة واحدة.
التحدي
سهلاقرأ سطرين من المدخلات:
- قائمة من الأعداد الصحيحة مفصولة بفاصلة، وهي
nums - قائمة من الأعداد الصحيحة مفصولة بفاصلة، وهي
repeats(بنفس طولnums)
لكل i، كرر nums[i] بالضبط repeats[i] من المرات. اطبع المصفوفة المسطحة الناتجة، مدمجة بـ ,. استخدم flatMap.
للمدخلات 5,7,2 في السطر 1 و 3,1,2 في السطر 2، المخرجات هي 5,5,5,7,2,2.
ورقة مرجعية
تقوم flatMap بتحويل كل عنصر إلى مصفوفة ودمج جميع النتائج في مصفوفة واحدة مسطحة:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]على عكس map (التي قد تنتج [[Int]])، تقوم flatMap بالتسطيح في خطوة واحدة. كما يمكنها تسطيح المصفوفات المتداخلة مباشرة:
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]جرّب بنفسك
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: استخدم flatMap لكل (num, repeat) لتحويلها إلى Array(repeating:count:)؛ ثم ادمجها باستخدام ","
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات