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.

ورقة مرجعية

بنية الإغلاق اللاحق (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) { ... } واطبع مدموجة بـ ","
quiz iconاختبر نفسك

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

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