التقاط القيم بالمرجع
افهم كيفية التقاط الإغلاقات للحالة المحيطة.
التقاط القيم بالمرجع درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما الذي تلتقطه الإغلاقات؟
يلتقط الإغلاق المتغيرات والثوابت من النطاق المحيط التي يشير إليها. وتُحتفظ بالمتغيرات الملتقطة حسب المرجع، لذلك يرى الإغلاق التغييرات اللاحقة.
التقاط ثابت
يتذكر الإغلاق greeting حتى بعد عودة الدالة:
func makeGreeter() -> () -> String {
let greeting = "Hello"
return { greeting }
}
let greet = makeGreeter()
print(greet()) // "Hello"التقاط متغير حسب المرجع
بما أن count متغير من نوع var، يغيّر الإغلاق مساحة التخزين نفسها عبر الاستدعاءات:
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next(), next(), next()) // 1 2 3مساحة تخزين مشتركة
يمكن لإغلاقين التقاط المتغير نفسه ورؤية تغييرات كل منهما على الآخر:
func makePair() -> (() -> Void, () -> Int) {
var value = 0
let inc = { value += 1 }
let read = { value }
return (inc, read)
}
let (inc, read) = makePair()
inc(); inc()
print(read()) // 2يعكس الالتقاط التغييرات اللاحقة
يقرأ الإغلاق القيمة الحالية للمتغير وقت الاستدعاء، وليس قيمته عند إنشاء الإغلاق:
var message = "first"
let show = { print(message) }
message = "second"
show() // "second"الالتقاط حسب المرجع مقابل الالتقاط حسب القيمة
بشكل افتراضي، يُلتقط المتغير القابل للتغيير حسب المرجع. وإذا أردتم نسخة ثابتة من قيمته وقت الإنشاء، فأدرجوه في قائمة التقاط مثل [x].
تثبيت قيمة
تنسخ قائمة الالتقاط القيمة فورًا:
var n = 10
let frozen = { [n] in n } // copies 10 now
n = 99
print(frozen()) // 10كل إغلاق له حالة مستقلة
ينشئ كل استدعاء للمصنع متغيرًا ملتقطًا جديدًا:
func counter() -> () -> Int {
var c = 0
return { c += 1; return c }
}
let a = counter(), b = counter()
print(a(), a(), b()) // 1 2 1الالتقاط داخل حلقة
من دون الانتباه، قد تشترك الإغلاقات داخل الحلقة في المتغير نفسه. استخدموا قائمة التقاط لإنشاء لقطة لكل تكرار:
var closures: [() -> Int] = []
for i in 1...3 {
closures.append { [i] in i }
}
print(closures.map { $0() }) // [1, 2, 3]التقاط self داخل دالة أسلوب
يلتقط الإغلاق الذي يُنشأ داخل دالة أسلوب النسخة المحيطة، مما يتيح له قراءة الخصائص وتغييرها لاحقًا:
class Bank {
var balance = 0
func deposit() -> () -> Void {
return { self.balance += 10 }
}
}
let bank = Bank()
let add = bank.deposit()
add(); add()
print(bank.balance) // 20لماذا يهم ذلك؟
يتيح الالتقاط حسب المرجع إنشاء العدادات والمجمّعات وعمليات الاستدعاء الراجعة ذات الحالة — لكنه يعني أيضًا أن الإغلاق قد يُبقي الكائنات حية، وسندير ذلك باستخدام قوائم الالتقاط لاحقًا.
func accumulator() -> (Int) -> Int {
var total = 0
return { total += $0; return total }
}
let add = accumulator()
print(add(10), add(5)) // 10 15تحقق سريع
كيف يلتقط الإغلاق متغيرًا قابلًا للتغيير افتراضيًا؟
مراجعة
لقد تعلمتم دلالات الالتقاط:
- تلتقط الإغلاقات المتغيرات التي يُشار إليها من نطاقها
- تُلتقط المتغيرات القابلة للتغيير حسب المرجع — فتكون التغييرات وعمليات التغيير مشتركة
- تثبّت قائمة الالتقاط
[x]نسخة من القيمة عند الإنشاء - يتيح ذلك إنشاء العدادات وعمليات الاستدعاء الراجعة ذات الحالة
التالي: الإغلاقات الهاربة.
الأسئلة الشائعة
هل درس «التقاط القيم بالمرجع» مجاني؟
نعم — نص درس «التقاط القيم بالمرجع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «التقاط القيم بالمرجع»؟
افهم كيفية التقاط الإغلاقات للحالة المحيطة. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التقاط القيم بالمرجع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التقاط القيم بالمرجع
- الإغلاقات الهاربة
- قوائم الالتقاط و weak self
- الإغلاقات التلقائية