0Pricing
Swift Academy · درس

التقاط القيم بالمرجع

افهم كيفية التقاط الإغلاقات للحالة المحيطة.

التقاط القيم بالمرجع درس مجاني في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التقاط القيم بالمرجع
  2. الإغلاقات الهاربة
  3. قوائم الالتقاط و weak self
  4. الإغلاقات التلقائية
← العودة إلى Swift Academy