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

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) { ... } تبدو وكأنها حلقة تكرار مدمجة. هذا هو الهدف: هياكل التحكم التي تبنيها بنفسك تبدو تماماً مثل تلك الموجودة في المكتبة القياسية.

challenge icon

التحدي

سهل

قم بتعريف دالة 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.

جرّب بنفسك

let n = Int(readLine()!)!

// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// ثم استدعِ collect(n) { ... } واطبع مدموجة بـ ","
quiz iconاختبر نفسك

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

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