Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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 يدمج هاتين الخطوتين في خطوة واحدة.

challenge icon

التحدي

سهل

اقرأ سطرين من المدخلات:

  1. قائمة من الأعداد الصحيحة مفصولة بفاصلة، وهي nums
  2. قائمة من الأعداد الصحيحة مفصولة بفاصلة، وهي 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:)؛ ثم ادمجها باستخدام ","
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق والتدفق