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

التقاط القيم

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

يتذكّر الإغلاق البرمجي المتغيرات التي كانت ضمن النطاق عند إنشائه. ويمكن لجسم الإغلاق قراءتها بل وتعديلها لاحقًا، حتى بعد أن تكون الدالة المحيطة قد أعادت القيمة. ويُسمّى هذا الالتقاط.

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

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

challenge icon

التحدي

متوسط

أنشئ مصنعًا صغيرًا للعدادات.

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

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

بالنسبة إلى الإدخال 5 / 3 / 4، يكون الناتج:

5
8
11
14

جرّب بنفسك

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

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

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

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

تدرّب بنفسك: Playground لـ Swift