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