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

التقاط القيم

جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 40 من 56.

يتذكر الـ closure المتغيرات التي كانت موجودة في النطاق (scope) عند إنشائه. يمكن لجسم الـ closure قراءتها وحتى تعديلها لاحقاً، حتى بعد انتهاء تنفيذ الدالة المحيطة. يسمى هذا بالالتقاط (capturing).

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let next = makeCounter()
print(next())                    // 1
print(next())                    // 2
print(next())                    // 3

كل استدعاء لـ makeCounter يمنحك count جديداً تماماً، لذا لا يتشارك عدادان الحالة أبداً:

let a = makeCounter()
let b = makeCounter()
print(a())                       // 1
print(b())                       // 1
print(a())                       // 2

الالتقاط (Capturing) هو ما يجعل الإغلاقات (closures) أكثر قوة من الدوال العادية: فهي تحمل الحالة معها. سترى نفس الحيلة في JavaScript و Python والعديد من اللغات الأخرى.

challenge icon

التحدي

متوسط

قم ببناء مصنع عداد صغير.

قم بتعريف دالة makeCounter(start: Int, step: Int) تُرجع إغلاقاً (closure) من النوع () -> Int. كل استدعاء للإغلاق يُرجع القيمة التالية: الاستدعاء الأول يُرجع start، والتالي يُرجع start + step، والتالي start + 2*step، وهكذا.

اقرأ ثلاثة أعداد صحيحة من المدخلات: start، و step، و n. قم ببناء عداد باستخدام start و step، ثم قم باستدعائه n من المرات واطبع كل نتيجة في سطر مستقل.

بالنسبة للمدخلات 5 / 3 / 4، المخرجات هي:

5
8
11
14

ورقة مرجعية

تلتقط الإغلاقات (Closures) المتغيرات من النطاق المحيط بها، وتحمل الحالة حتى بعد انتهاء الدالة الخارجية:

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let next = makeCounter()
print(next()) // 1
print(next()) // 2

ينشئ كل استدعاء لدالة المصنع متغيراً ملتقطاً مستقلاً — ولا يتشارك عدادان الحالة أبداً.

جرّب بنفسك

let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!

// مهام: (makeCounter(start:step -> () -> Int التي تحتفظ بالقيمة الحالية
// ثم قم باستدعائها n من المرات واطبع كل نتيجة
quiz iconاختبر نفسك

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

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