التقاط القيم
جزء من قسم المنطق والتدفق في رحلة 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 والعديد من اللغات الأخرى.
التحدي
متوسطأنشئ مصنعًا صغيرًا للعدادات.
عرّف دالة 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 مرات واطبع كل نتيجة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلماتتدرّب بنفسك: Playground لـ Swift