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