بناء سلاسل العمليات
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 31 من 56.
إن الطرق التي جمعتها، map، و filter، و reduce، و compactMap، و flatMap، و sorted(by:)، هي أدوات Swift اليومية. الشيفرة البرمجية الحقيقية تربطهم معاً.
struct Order {
let item: String
let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
print(names) // ["milk", "apple"]اقرأ السلسلة من الأعلى إلى الأسفل: احتفظ بالطلبات غير الفارغة، ورتبها حسب الكمية تنازلياً، ثم احتفظ بالأسماء فقط.
تنجح خطوط المعالجة (Pipelines) عندما يكون لكل خطوة غرض واحد. إذا وجدت نفسك تقوم بأمرين في وقت واحد داخل الـ closure (الـ mapping و الـ filtering)، فقم بتقسيمهما إلى خطوتين. تظل السلسلة قابلة للقراءة مع نموها.
التحدي
متوسطاقرأ سطراً واحداً من المدخلات: قائمة مفصولة بفاصلة من مدخلات name:price:qty. بعض المدخلات غير صحيحة ويجب تخطيها: أي مدخل لا يكون فيه السعر (price) أو الكمية (quantity) عدداً صحيحاً صالحاً.
قم ببناء مسار (pipeline) ينتج سطراً واحداً لكل مدخل صالح حيث qty > 0، مرتبة حسب المجموع (price * qty) تنازلياً، بالتنسيق التالي:
<name>: <total>بعد الأسطر الخاصة بكل عنصر، اطبع سطر ملخص واحداً: Sum: <n> مع المجموع الكلي.
للمدخلات apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7، يكون المخرج:
milk: 20
salt: 14
apple: 6
Sum: 40ورقة مرجعية
يؤدي تسلسل الدوال من الرتبة العليا (higher-order functions) إلى إنشاء خطوط معالجة (pipelines) سهلة القراءة حيث يكون لكل خطوة غرض واحد:
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
طرق خطوط المعالجة الشائعة: filter ← compactMap ← sorted(by:) ← map ← reduce. إذا كان الإغلاق (closure) يقوم بأمرين في وقت واحد (على سبيل المثال: التحويل و التصفية)، فقم بتقسيمه إلى خطوتين.
جرّب بنفسك
let entries = readLine()!.components(separatedBy: ",")
// TODO: سلسلة عمليات باستخدام compactMap (parse)، و filter (qty > 0)،
// sorted (total desc)، و map (format)؛ طباعة الأسطر + Sum
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات