0Pricing
Swift Academy · درس

الإغلاقات التلقائية

أجّل تقييم التعبير باستخدام @autoclosure.

الإغلاقات التلقائية درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

ما الإغلاق التلقائي؟

تغلّف @autoclosure تعبير الوسيط تلقائيًا داخل إغلاق، ولذلك لا يُقيَّم حتى تستخدمه الدالة فعليًا. ويكتب المستدعي تعبيرًا عاديًا، لا إغلاقًا.

من دون الإغلاق التلقائي

يتطلب التقييم المؤجل عادةً إغلاقًا صريحًا في موضع الاستدعاء:

func logIf(_ cond: Bool, _ message: () -> String) {
    if cond { print(message()) }
}
logIf(true) { "expensive" }  // caller writes braces

مع الإغلاق التلقائي

يتيح @autoclosure للمستدعي تمرير تعبير مباشر:

func logIf(_ cond: Bool, _ message: @autoclosure () -> String) {
    if cond { print(message()) }
}
logIf(true, "expensive")  // no braces, evaluated only if cond

إثبات التقييم المؤجل

يُنفّذ التعبير فقط عند استدعاء الإغلاق:

func pick(_ cond: Bool, _ value: @autoclosure () -> Int) -> Int {
    cond ? value() : -1
}
func costly() -> Int { print("computed"); return 42 }
print(pick(false, costly()))  // -1  -- "computed" never prints

مواضع استخدامه في المكتبة القياسية

تستخدم عوامل التشغيل && و||، والدالة assert، والعامل ?? الإغلاقات التلقائية، بحيث لا يُقيَّم الطرف الأيمن إلا عند الحاجة.

توقف مبكر مثل ??

دالة مخصصة للقيمة الافتراضية تتجاوز القيمة البديلة عندما لا تكون مطلوبة:

func orElse<T>(_ value: T?, _ fallback: @autoclosure () -> T) -> T {
    value ?? fallback()
}
func makeDefault() -> Int { print("built"); return 0 }
print(orElse(5, makeDefault()))  // 5  -- "built" never prints

رسائل بأسلوب assert تُقيَّم بطريقة كسولة

أنشئوا الرسالة فقط عند فشل التحقق:

func check(_ cond: Bool, _ msg: @autoclosure () -> String) {
    if !cond { print("FAIL: \(msg())") }
}
check(true, "this is never built")
check(false, "boom")  // FAIL: boom

الإغلاق التلقائي مع الإغلاق الهارب

اجمعوا بينهما وبين @escaping لتخزين التعبير المؤجل لاستخدامه لاحقًا:

var thunks: [() -> Int] = []
func defer2(_ expr: @autoclosure @escaping () -> Int) {
    thunks.append(expr)
}
defer2(1 + 1)
print(thunks[0]())  // 2  -- computed on demand

قراءة أوضح في موضع الاستدعاء

الفائدة هنا تركيبية بحتة: يكتب المستدعون قيمة، بينما تحصل الدالة على إغلاق:

func unless(_ cond: Bool, _ value: @autoclosure () -> String) -> String {
    cond ? "skipped" : value()
}
print(unless(false, "shown"))  // "shown"

متى لا نستخدمه؟

تخفي الإغلاقات التلقائية حقيقة أن الوسيط إغلاق، مما قد يفاجئ القراء. استخدموها باعتدال — فقط عندما يكون التقييم المؤجل مفيدًا فعلًا، مثل تجنب القيم الافتراضية المكلفة.

func first<T>(_ a: T?, _ b: @autoclosure () -> T) -> T { a ?? b() }
print(first(nil, 99))  // 99

الإغلاقات التلقائية لا تقبل وسائط

يكون للإغلاق التلقائي دائمًا الشكل () -> T — إذ يغلّف تعبيرًا واحدًا ولا يمكنه قبول مَعالِم:

func once(_ make: @autoclosure () -> [Int]) -> Int {
    make().count
}
print(once([1, 2, 3]))  // 3

تحقق سريع

ماذا تفعل @autoclosure بالوسيط الذي تتلقاه؟

مراجعة

لقد تعلمتم الإغلاقات التلقائية:

  • تغلّف @autoclosure تعبير الوسيط داخل إغلاق من الشكل () -> T
  • يُنفّذ التعبير فقط عندما تستدعيه الدالة — وهذا هو التقييم المؤجل
  • تستخدمها عوامل التشغيل && و|| و??، إضافةً إلى assert
  • يمكن جمعها مع @escaping للتخزين؛ استخدموها باعتدال للحفاظ على الوضوح

اكتملت الدورة! التالي: Equatable وHashable وComparable.

الأسئلة الشائعة

هل درس «الإغلاقات التلقائية» مجاني؟

نعم — نص درس «الإغلاقات التلقائية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «الإغلاقات التلقائية»؟

أجّل تقييم التعبير باستخدام @autoclosure. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الإغلاقات التلقائية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

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