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