Swift Academy · درس

‏defer مع الأخطاء وعمليات الإرجاع المبكر

اضمن التنظيف حتى عند طرح خطأ أو الإرجاع مبكرًا.

الدرس 4 من 413 خطوة

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

يُنفَّذ defer عند return

تُنفَّذ كتلة defer حتى عند خروج الدالة مبكرًا عبر return.

func check(_ value: Int) {
    defer { print("cleanup ran") }
    if value < 0 {
        print("negative, returning early")
        return
    }
    print("value is", value)
}
check(-5)

التنظيف في كل مسار

بصرف النظر عن تعليمة return التي تُنفَّذ، يُنفَّذ التنظيف المؤجَّل مرةً واحدة بالضبط.

func classify(_ n: Int) {
    defer { print("done classifying") }
    if n == 0 { print("zero"); return }
    if n > 0 { print("positive"); return }
    print("negative")
}
classify(0)

يُنفَّذ defer عند throw

عندما ترمي الدالة خطأً، تستمر كتل defer المسجَّلة في التنفيذ أثناء فك النطاقات.

enum MyError: Error { case bad }
func risky(_ fail: Bool) throws {
    defer { print("cleanup on the way out") }
    if fail { throw MyError.bad }
    print("no failure")
}
try? risky(true)

الجمع بين return وthrow

سواء عادت الدالة بشكل طبيعي أو رمت خطأً، تُنفَّذ كتلة defer نفسها.

enum E: Error { case oops }
func op(_ flag: Bool) throws -> Int {
    defer { print("op finishing") }
    if flag { throw E.oops }
    return 42
}
let r = try? op(false)
print(r ?? -1)

التنظيف قبل انتشار الخطأ

تُنفَّذ كتلة defer قبل وصول الخطأ المرمي إلى المستدعي، ولذلك تُحرَّر الموارد أولًا.

enum E: Error { case fail }
func load(_ broken: Bool) throws {
    print("open")
    defer { print("close") }
    if broken { throw E.fail }
    print("read")
}
do {
    try load(true)
} catch {
    print("caught:", error)
}

الحماية باستخدام defer

نمط شائع: اكتساب المورد، وتأجيل تنظيفه، ثم استخدام guard مع عمليات عودة مبكرة تؤدي مع ذلك إلى تشغيل التنظيف.

func process(_ items: [Int]) {
    print("start")
    defer { print("finished") }
    guard !items.isEmpty else {
        print("nothing to do")
        return
    }
    print("processing", items.count, "items")
}
process([])

defer والحلقات التي ترمي أخطاء

تُنفَّذ كتلة defer داخل الحلقة في نهاية كل تكرار، حتى إذا رمت تعليمة لاحقة خطأً.

enum E: Error { case stop }
func loop() throws {
    for i in 1...3 {
        defer { print("end", i) }
        if i == 2 { throw E.stop }
        print("body", i)
    }
}
try? loop()

الترتيب مع العودة المبكرة

تستمر كتل defer المتعددة في التنفيذ بترتيب LIFO عند العودة المبكرة.

func multi(_ skip: Bool) {
    defer { print("A") }
    defer { print("B") }
    if skip { return }
    print("body")
}
multi(true)

التسجيل عند الفشل

استخدم defer لتسجيل الإكمال أو الفشل باستمرار عبر جميع مسارات الخروج.

enum E: Error { case bad }
func attempt(_ fail: Bool) throws {
    var success = false
    defer { print("attempt success:", success) }
    if fail { throw E.bad }
    success = true
}
try? attempt(true)

استعادة الحالة عند throw

يُعد defer مثاليًا للتراجع عن تغييرات الحالة المؤقتة عند رمي العملية خطأً.

enum E: Error { case fail }
func transaction(_ fail: Bool) throws {
    var inProgress = true
    defer { inProgress = false; print("inProgress:", inProgress) }
    if fail { throw E.fail }
    print("committed")
}
try? transaction(true)

أفضل ممارسة

اعتمد على defer لتنفيذ التنظيف الذي يجب أن يستمر عبر عمليات العودة المبكرة والأخطاء المرميّة، حتى لا يتسبب أي مسار للخروج في تسرّب الموارد.

enum E: Error { case x }
func safe(_ fail: Bool) throws {
    print("acquire")
    defer { print("release") }
    if fail { throw E.x }
    print("use")
}
try? safe(true)

تحقق سريع

اختبر defer مع الأخطاء وعمليات العودة.

مراجعة

يُنفَّذ defer عند كل خروج من النطاق، بما في ذلك return المبكر والخطأ المرمي، ويُنفَّذ قبل انتشار الخطأ. وهذا يجعله المكان الموثوق للتنظيف واستعادة الحالة عبر جميع مسارات الخروج، مع الحفاظ على ترتيب LIFO.

func f(_ skip: Bool) {
    defer { print("cleanup") }
    if skip { return }
    print("work")
}
f(true)
البدء مجانًا

تعلم Swift مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
122
الدروس
409

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

هل درس «‏defer مع الأخطاء وعمليات الإرجاع المبكر» مجاني؟

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

ماذا ستتعلم في «‏defer مع الأخطاء وعمليات الإرجاع المبكر»؟

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

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

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

كم من الوقت يستغرق درس «‏defer مع الأخطاء وعمليات الإرجاع المبكر»؟

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

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

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

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

  1. كيفية عمل defer
  2. ترتيب كتل defer المتعددة
  3. ‏defer لتنظيف الموارد
  4. ‏defer مع الأخطاء وعمليات الإرجاع المبكر
← العودة إلى Swift Academy