0Pricing
Swift Academy · درس

Escaping مقابل non-escaping وautoclosures

افهم الفرق بين Closures غير الهاربة (الافتراضية) و@escaping (المخزّنة أو المستخدمة بعد الإعادة)، واستخدم @autoclosure للحصول على استدعاءات أبسط مع تقييم كسول.

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

نظرة عامة

الهدف: معرفة متى تكون closure من نوع non-escaping (الافتراضي) ومتى تكون @escaping (مخزّنة أو غير متزامنة)، وكيف تجعل @autoclosure مواضع الاستدعاء أكثر وضوحًا.

الافتراضي non-escaping

تكون معاملات closure من نوع non-escaping افتراضيًا؛ إذ تُستدعى قبل أن تُرجع الدالة قيمتها ولا يتم تخزينها مطلقًا.

// Non-escaping by default: used immediately inside the function.
func applyTwice(_ f: (Int) -> Int, to x: Int) -> Int {
    return f(f(x))   // called synchronously; not stored
}
let doubled = applyTwice({ $0 * 2 }, to: 3)
print(doubled)  // 12

Closure من نوع escaping

ميّز المعامل باستخدام @escaping إذا كنت ستخزن closure أو تنفذها بعد عودة الدالة، مثل المؤقتات والعمليات غير المتزامنة.

// Need @escaping when storing for later use:
var tasks: [() -> Void] = []

func addTask(_ work: @escaping () -> Void) {
    tasks.append(work)  // stored to run later
}

addTask { print("run later") }
tasks.forEach { $0() }

الإكمال غير المتزامن

تأخذ واجهات API غير المتزامنة عادةً معالجات إكمال من نوع @escaping، ويتم استدعاؤها بعد عودة الدالة.

func fetchData(completion: @escaping (String) -> Void) {
    // simulate async: call completion in the future
    // (In real apps, use DispatchQueue or URLSession)
    completion("done")  // still escaping by contract (may be called later)
}
fetchData { result in print(result) }

Autoclosure

تتيح @autoclosure للمستدعين تمرير تعبير بدلًا من كتابة closure، مما يحسن قابلية القراءة.

// @autoclosure converts an expression into () -> Bool automatically.
func logIf(_ condition: @autoclosure () -> Bool) {
    if condition() { print("Condition is true") }
}

let x = 3
logIf(x > 1)       // no braces needed; expression is turned into a closure

Autoclosure + escaping

تخزن @autoclosure @escaping التعبير المُمرر لتقييمه لاحقًا؛ لذا انتبه إلى الحالة الملتقطة والتوقيت.

// You can combine @autoclosure with @escaping:
// (be careful: the expression is captured and evaluated later)
var checks: [() -> Bool] = []

func enqueueCheck(_ condition: @autoclosure @escaping () -> Bool) {
    checks.append(condition)   // stored to run later
}

var threshold = 10
enqueueCheck(threshold > 5)   // captures current variable by reference semantics
threshold = 3
print(checks.map { $0() })    // re-evaluates with updated threshold

قاعدة escaping

تحقق سريع: متى يكون @escaping مطلوبًا؟

مراجعة

مراجعة: تكون Closures من نوع non-escaping افتراضيًا. استخدم @escaping إذا كانت closure ستُخزّن أو ستُستدعى لاحقًا. واستخدم @autoclosure لجعل مواضع الاستدعاء أكثر وضوحًا، واجمعها مع @escaping بحذر.

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

هل درس «Escaping مقابل non-escaping وautoclosures» مجاني؟

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

ماذا ستتعلم في «Escaping مقابل non-escaping وautoclosures»؟

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

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

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

كم من الوقت يستغرق درس «Escaping مقابل non-escaping وautoclosures»؟

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

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

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

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

  1. أساسيات Closures والالتقاط
  2. قوائم الالتقاط — weak وunowned والتقاط القيم
  3. Escaping مقابل non-escaping وautoclosures
← العودة إلى Swift Academy