قوائم الالتقاط — weak وunowned والتقاط القيم
استخدم قوائم الالتقاط للتحكم في كيفية التقاط Closures للمراجع والقيم: [weak self] وunowned ولقطات القيم، لتجنّب دورات الاحتفاظ والأخطاء الخفية.
قوائم الالتقاط — weak وunowned والتقاط القيم درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.
لماذا قوائم الالتقاط؟
الهدف: تحكم فيما تلتقطه closure وكيفية التقاطه. استخدم [weak self] أو unowned لتجنب دورات الاحتفاظ، والتقط لقطات للقيم عند الحاجة.
الالتقاط القوي = خطر حدوث دورة
تحتفظ closures التي تهرب أو تُخزّن بالقيم الملتقطة. وقد يؤدي التقاط self بشكل قوي هنا إلى إنشاء دورة احتفاظ.
class Owner {
var name = "Owner"
var onDone: (() -> Void)?
func start() {
// Strong capture of self can cause a cycle if onDone is stored:
onDone = {
print("Done by", self.name) // self captured strongly
}
}
}
var o: Owner? = Owner()
o?.start()
// If nothing nils onDone or o, both can keep each other alive.نمط الالتقاط الضعيف
استخدم [weak self] لكسر الدورة. تكون self اختيارية في الداخل؛ فكّ تغليفها باستخدام guard let أو السلسلة الاختيارية.
class Owner2 {
var name = "Owner2"
var onDone: (() -> Void)?
func start() {
onDone = { [weak self] in
guard let self = self else { return } // safely unwrap optional self
print("Done by", self.name)
}
}
}
let o2 = Owner2()
o2.start()
o2.onDone?()unowned (استخدمه بحذر)
يفترض unowned أن self سيظل موجودًا بعد closure، ولذلك فهو غير اختياري. استخدمه فقط عندما تكون متأكدًا من أنه لا يمكن أن يكون nil وقت الاستدعاء.
class Owner3 {
var onDone: (() -> Void)?
func work() {
onDone = { [unowned self] in
// self must be alive when this runs; otherwise crash
print("Owner3 still alive")
}
}
}
let o3 = Owner3()
o3.work()
o3.onDone?()فكرة لقطة القيمة
يمكن لقوائم الالتقاط أخذ لقطة للقيم، مثل [n = count]. ومن دون قائمة، تظل ثوابت let الداخلية ملتقطة عند إنشاء closure.
var count = 0
let makeLogger: () -> () -> Void = {
let snapshot = count // captured by value at creation
return {
print("snapshot =", snapshot, "current =", count)
}
}
count = 10
let logger = makeLogger()
count = 20
logger() // snapshot = 10, current = 20ربط قيمة في قائمة الالتقاط
استخدم قائمة التقاط لإنشاء لقطة لقيمة مسماة، مثل [initial = total]، وقت إنشاء closure.
var total = 5
let closure = { [initial = total] in
print("initial:", initial, " now:", total)
}
total = 9
closure() // initial uses captured value 5سبب استخدام weak self
تحقق سريع: لماذا نضيف [weak self] إلى closure مخزّنة أو تهرب؟
مراجعة
مراجعة: استخدم [weak self] لكسر الدورات، إذ تصبح self اختيارية، واستخدم unowned فقط عندما يكون العمر مضمونًا، والتقط لقطات للقيم باستخدام روابط قوائم الالتقاط.
الأسئلة الشائعة
هل درس «قوائم الالتقاط — weak وunowned والتقاط القيم» مجاني؟
نعم — نص درس «قوائم الالتقاط — weak وunowned والتقاط القيم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.
ماذا ستتعلم في «قوائم الالتقاط — weak وunowned والتقاط القيم»؟
استخدم قوائم الالتقاط للتحكم في كيفية التقاط Closures للمراجع والقيم: [weak self] وunowned ولقطات القيم، لتجنّب دورات الاحتفاظ والأخطاء الخفية. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.
كم من الوقت يستغرق درس «قوائم الالتقاط — weak وunowned والتقاط القيم»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات Closures والالتقاط
- قوائم الالتقاط — weak وunowned والتقاط القيم
- Escaping مقابل non-escaping وautoclosures