reduce و reduce(into:)
جمّع المجموعات في قيمة واحدة.
reduce و reduce(into:) درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما هي reduce؟
تختزل reduce تسلسلًا كاملًا إلى قيمة واحدة من خلال الجمع المتكرر بين المُراكم وكل عنصر.
- تحدّدون قيمة ابتدائية
- وتحدّدون إغلاقًا بالشكل
(accumulator, element) -> accumulator
الجمع باستخدام reduce
المثال الكلاسيكي — جمع كل العناصر:
let nums = [1, 2, 3, 4]
let total = nums.reduce(0) { acc, x in acc + x }
print(total) // 10الصيغة المختصرة للعوامل
عندما يكون الإغلاق مجرد عامل، يمكنكم تمرير دالة العامل مباشرة:
let nums = [1, 2, 3, 4]
print(nums.reduce(0, +)) // 10
print(nums.reduce(1, *)) // 24الاختزال إلى نوع مختلف
يمكن أن يختلف نوع النتيجة عن نوع العناصر:
let words = ["a", "b", "c"]
let joined = words.reduce("") { $0 + $1.uppercased() }
print(joined) // "ABC"العثور على القيمة العظمى باستخدام reduce
يمكنكم حساب تجميعات تتجاوز عمليات الجمع:
let nums = [3, 9, 2, 7]
let maxVal = nums.reduce(Int.min) { max($0, $1) }
print(maxVal) // 9تكلفة reduce
تنشئ reduce العادية مُراكمًا جديدًا تمامًا في كل خطوة. وبالنسبة إلى أنواع القيم مثل String أو Array، يعني ذلك نسخ المُراكم بأكمله مع كل عنصر — أي عمل بتعقيد O(n²) عند معالجة مدخلات كبيرة.
هنا يأتي reduce(into:)
تمرّر reduce(into:) المُراكم كمعامل inout، ولذلك تعدّلونه في مكانه بدلًا من نسخه:
let nums = [1, 2, 2, 3, 3, 3]
let counts = nums.reduce(into: [Int: Int]()) { dict, n in
dict[n, default: 0] += 1
}
print(counts) // [1: 1, 2: 2, 3: 3]إنشاء مصفوفة بكفاءة
يتألق reduce(into:) عند التجميع داخل مجموعة:
let nums = [1, 2, 3, 4, 5]
let evensSquared = nums.reduce(into: [Int]()) { result, n in
if n % 2 == 0 { result.append(n * n) }
}
print(evensSquared) // [4, 16]مقارنة بين reduce و reduce(into:)
النتيجة نفسها، لكن خصائص الأداء مختلفة:
let parts = ["a", "b", "c"]
let a = parts.reduce("") { $0 + $1 } // copies each step
let b = parts.reduce(into: "") { $0 += $1 } // mutates in place
print(a, b) // abc abcالتجميع باستخدام reduce(into:)
نمط شائع: تجميع العناصر في مجموعات وفق مفتاح:
let names = ["Ann", "Al", "Bo", "Cy"]
let byInitial = names.reduce(into: [Character: [String]]()) { dict, name in
dict[name.first!, default: []].append(name)
}
print(byInitial[Character("A")]!) // ["Ann", "Al"]الاختيار بينهما
استخدموا reduce مع المُراكمات العددية منخفضة التكلفة مثل Int وDouble. واستخدموا reduce(into:) كلما كان المُراكم مجموعة أو نوع قيمة كبيرًا آخر لتجنب عمليات النسخ.
let nums = [1, 2, 3]
print(nums.reduce(0, +)) // scalar: plain reduce
print(nums.reduce(into: Set<Int>()) { $0.insert($1) }) // collection: intoاختبار سريع
لماذا نفضّل reduce(into:) عند إنشاء قاموس أو مصفوفة؟
مراجعة
لقد تعلمتم الاختزال:
reduce(initial) { acc, x in ... }تختزل تسلسلًا إلى قيمة واحدة- الصيغة المختصرة للعامل:
reduce(0, +) - تعدّل
reduce(into:)مُراكمًا من النوعinout— استخدموها مع المجموعات - وهي مناسبة جدًا للعدّ والتجميع والضم
التالي: flatMap والتسلسل.
الأسئلة الشائعة
هل درس «reduce و reduce(into:)» مجاني؟
نعم — نص درس «reduce و reduce(into:)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «reduce و reduce(into:)»؟
جمّع المجموعات في قيمة واحدة. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «reduce و reduce(into:)»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- map و compactMap
- filter والمسندات
- reduce و reduce(into:)
- flatMap والتسلسل