Trailing Closures
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 39 من 56.
عندما يكون الـ closure هو المعامل الأخير للدالة، يمكنك كتابته خارج الأقواس. هذا هو شكل الـ trailing-closure، وهو ما يجعل كود Swift يُقرأ بشكل طبيعي.
let nums = [1, 2, 3]
// الصيغة القياسية
let a = nums.map({ $0 * 2 })
// صيغة الإغلاق اللاحق (Trailing-closure)
let b = nums.map { $0 * 2 }إذا كان الـ closure هو الوسيط الوحيد، تختفي الأقواس أيضاً. لهذا السبب فإن كل ما رأيته حتى الآن يبدو وكأنه هيكل تحكم مخصص.
يمكنك كتابة دوالك الخاصة لاستقبال الإغلاقات (closures) بنفس الطريقة:
func repeatN(_ n: Int, action: () -> Void) {
for _ in 0..<n {
action()
}
}
repeatN(3) {
print("hi")
}صيغة الإغلاق اللاحق (trailing-closure) تجعل repeatN(3) { ... } تبدو وكأنها حلقة تكرار مدمجة. هذا هو الهدف: هياكل التحكم التي تبنيها بنفسك تبدو تماماً مثل تلك الموجودة في المكتبة القياسية.
التحدي
سهلقم بتعريف دالة collect تقوم بما يلي:
- تأخذ عدداً صحيحاً
nو closure باسمbuilder: (Int) -> String - تستدعي
builderلكلiمن1إلىn(بما في ذلكn) وتعيد مصفوفة من السلاسل النصية الناتجة
اقرأ عدداً صحيحاً من stdin، واستدعِ collect بهذا العدد باستخدام trailing closure ينتج "i=<i>" لكل قيمة، واطبع النتيجة مدمجة بفاصلة ,.
بالنسبة للمدخل 4، يكون المخرج i=1,i=2,i=3,i=4.
ورقة مرجعية
بنية الإغلاق اللاحق (Trailing closure syntax): عندما يكون الإغلاق (closure) هو المعامل الأخير، يمكن كتابته خارج الأقواس. وإذا كان هو المعامل الوحيد، يتم حذف الأقواس تماماً.
let nums = [1, 2, 3]
let a = nums.map({ $0 * 2 }) // قياسي
let b = nums.map { $0 * 2 } // إغلاق لاحقيمكن للوظائف المخصصة قبول الإغلاقات بنفس الطريقة، مما يجعلها تبدو مثل هياكل التحكم المدمجة:
func repeatN(_ n: Int, action: () -> Void) {
for _ in 0..<n {
action()
}
}
repeatN(3) {
print("hi")
}جرّب بنفسك
let n = Int(readLine()!)!
// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// ثم استدعِ collect(n) { ... } واطبع مدموجة بـ ","
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات8Closures
أساسيات ClosuresTrailing Closuresالتقاط القيمإرجاع Closuresدوال Higher-Order مخصصةمراجعة - بناء Pipeline