Swift Academy · درس

عزل Actor و nonisolated

حلّل حدود العزل.

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

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

ما عزل actor؟

يعني عزل actor أن الحالة القابلة للتغيير في actor لا يمكن الوصول إليها إلا من خلال شيفرة تعمل على ذلك actor.

تسلسل بيئة التشغيل عمليات الوصول، بحيث لا تعدّل مهمتان الحالة في الوقت نفسه، مما يلغي سباقات البيانات.

actor Counter {
    private var value = 0
    func increment() { value += 1 }
}

استدعاء actor

من خارج actor، يكون الوصول إلى الأعضاء المعزولة غير متزامن. يجب استخدام await لأن الاستدعاء قد يتوقف مؤقتًا إلى أن يصبح actor متاحًا.

let counter = Counter()
func useCounter() async {
    await counter.increment()
}

داخل actor: متزامن

داخل أساليب actor نفسه، تكون معزولًا بالفعل، لذلك تصل إلى الحالة بشكل متزامن، ولا تحتاج إلى await عند الوصول إلى self.

actor Counter {
    private var value = 0
    func incrementTwice() {
        value += 1 // synchronous: already isolated
        value += 1
    }
}

أعضاء nonisolated

ضع الوسم nonisolated على العضو عندما لا يصل إلى حالة قابلة للتغيير. تعمل هذه الأعضاء بشكل متزامن من أي مكان، من دون await.

وهذا مثالي للقيم المحسوبة المبنية على بيانات غير قابلة للتغيير فقط.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    nonisolated var label: String { "User #\(id)" }
}

لماذا يُعد nonisolated آمنًا؟

لا يجوز لعضو nonisolated إلا قراءة حالة غير قابلة للتغيير (let) أو حالة متوافقة مع Sendable بطريقة أخرى.

يرفض المصرّف أي محاولة للوصول إلى حالة معزولة وقابلة للتغيير من سياق nonisolated.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    // Error: cannot read mutable sessionCount here
    // nonisolated var bad: Int { sessionCount }
}

nonisolated والبروتوكولات

يُعد nonisolated ضروريًا عندما يمتثل actor لبروتوكول متزامن. فلا يمكن أن تكون دالة البروتوكول غير متزامنة، ولذلك يجب أن تتجنب الحالة المعزولة.

actor Item: CustomStringConvertible {
    let name: String
    init(name: String) { self.name = name }
    nonisolated var description: String { "Item: \(name)" }
}

MainActor

يُعد @MainActor actor عامًا يعزل الشيفرة في الخيط الرئيسي. ويجب أن تتم تحديثات واجهة المستخدم هنا.

ضع التعليق على الأنواع أو الأساليب أو الخصائص لتثبيتها على actor الرئيسي.

@MainActor
final class ViewModel {
    var title = "Hello"
    func refresh() { title = "Updated" }
}

الانتقال بين actors

عند الاستدعاء من actor إلى آخر، تنتقل بيئة التشغيل بين المنفذين وتعلّق التنفيذ. ويظهر await تحديدًا عند نقطة التعليق هذه.

actor Database { func load() -> Int { 42 } }
@MainActor
func show(_ db: Database) async {
    let v = await db.load() // hop to db actor
    print(v)               // hop back to main
}

إعادة الدخول إلى actor

تتسم actors بإمكانية إعادة الدخول: فعندما ينتظر أسلوب ما، يمكن لـ actor تشغيل عمل آخر في قائمة الانتظار قبل استئناف التنفيذ بعد await.

قد تكون الحالة التي قرأتها قبل await قد تغيرت بعده. أعد التحقق من افتراضاتك بعد نقاط التعليق.

actor Store {
    var ready = false
    func prepare() async {
        ready = false
        await Task.yield() // other calls may run here
        ready = true
    }
}

المعلمات isolated

يمكن للدالة قبول معلمة actor تحمل الوسم isolated، بحيث يعمل جسمها على ذلك actor من دون أن تكون الدالة عضوًا فيه.

func bump(on counter: isolated Counter) {
    // runs isolated to counter; synchronous access
}

العوامل العامة للأنظمة الفرعية

يمكنك تعريف actor عام خاص بك لعزل نظام فرعي كامل (مثل خط أنابيب العرض) على منفذ تنفيذ واحد.

@globalActor
actor RenderActor {
    static let shared = RenderActor()
}
@RenderActor func draw() { }

تحقق سريع: العزل

اختبر مدى فهمك لعزل actor.

مراجعة: عزل actor وnonisolated

يسلسل عزل actor الوصول إلى الحالة القابلة للتغيير؛ وتكون الاستدعاءات بين actors غير متزامنة وتتطلب await. وتخرج أعضاء nonisolated من العزل، لكنها لا تقرأ إلا حالة غير قابلة للتغيير أو متوافقة مع Sendable، وهو أمر ضروري للامتثال للبروتوكولات المتزامنة.

يثبت @MainActor الشيفرة على الخيط الرئيسي، وتسمح actors بإعادة الدخول (إذ يمكن أن تتغير الحالة عبر await)، بينما تعزل actors العامة أنظمة فرعية كاملة. ويُعد إتقان هذه القواعد أساس التزامن الآمن.

البدء مجانًا

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

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

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

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

هل درس «عزل Actor و nonisolated» مجاني؟

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

ماذا ستتعلم في «عزل Actor و nonisolated»؟

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

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

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

كم من الوقت يستغرق درس «عزل Actor و nonisolated»؟

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

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

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

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

  1. مشكلة سباق البيانات
  2. بروتوكول Sendable
  3. عزل Actor و nonisolated
  4. الترحيل إلى التزامن الصارم
← العودة إلى Swift Academy