العوامل وعزل البيانات وnonisolated
تعلّم عزل actor: تكون الحالة محمية خلف actor ، ويتطلب الوصول بين العوامل استخدام await ، بينما تتجاوز الأعضاء nonisolated العزل عندما تكون نقية أو ساكنة.
العوامل وعزل البيانات وnonisolated درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.
ما الذي توفره actors
يحمي actor حالته القابلة للتغيير. ولا تلمس الحالة المعزولة إلا مهمة واحدة في كل مرة؛ ويجب على المستدعين الخارجيين استخدام await مع أساليبه.
- العزل = عدم حدوث تعارضات في البيانات
- الاستدعاءات بين actors غير متزامنة
- استخدم nonisolated للأعضاء النقية أو الثابتة
أساسيات actor
يكون الوصول مباشرًا من داخل actor. أما من خارجه، فيجب استخدام await مع عمليات قراءة الحالة المعزولة وكتابتها.
actor Counter {
private var value: Int = 0 // isolated state
func increment() { value += 1 } // isolated method (async to outsiders)
func get() -> Int { value } // read isolated state
}
let c = Counter()
Task {
await c.increment()
print(await c.get()) // 1
}ضمان التسلسل
حتى إذا استدعت مهام متعددة actor بالتزامن، فإن actor يُسلسل الوصول إلى حالته، مما يمنع التعارضات.
actor BankAccount {
private var balance: Int = 0
func deposit(_ amount: Int) { balance += amount }
func withdraw(_ amount: Int) -> Bool {
if balance >= amount { balance -= amount; return true }
return false
}
func current() -> Int { balance }
}
let acc = BankAccount()
Task {
async let a = acc.deposit(50)
async let b = acc.withdraw(20)
_ = await (a, b) // operations are serialized inside the actor
print(await acc.current()) // deterministic balance
}واجهات nonisolated API
استخدم nonisolated للأعضاء النقية أو الثابتة حتى لا يحتاج المستدعون إلى await. ويجب ألا تصل هذه الأعضاء إلى الحالة المعزولة.
actor Clock {
private var ticks: Int = 0
func tick() { ticks += 1 }
func read() -> Int { ticks }
// Nonisolated: safe without awaiting (pure computation / constant)
nonisolated static let format = "HH:mm:ss"
nonisolated func describeFormat() -> String {
// Cannot touch isolated state here; this is pure
return "Format: " + Self.format
}
}
let cl = Clock()
Task {
await cl.tick()
print(await cl.read()) // 1
// Nonisolated members don't require await:
print(Clock.format) // "HH:mm:ss"
print(cl.describeFormat()) // sync call
}الانتباه إلى إمكانية إعادة الدخول
يمكن أن تكون actors قابلة لإعادة الدخول: فبعد await داخل أسلوب actor، قد تُنفّذ رسائل أخرى. حافظ على صحة الثوابت المنطقية عبر نقاط await.
actor Logger {
private var lines: [String] = []
func log(_ s: String) async {
lines.append(s)
// Simulate an await point; actor may process other messages here (reentrant)
try? await Task.sleep(nanoseconds: 10_000_000)
lines.append("done")
}
func snapshot() -> [String] { lines }
}
let logger = Logger()
Task {
async let a = logger.log("A")
async let b = logger.log("B")
_ = await (a, b)
print(await logger.snapshot()) // order shows possible interleaving
}أفضل الممارسات
إرشادات:
- اعرض أساليب async صغيرة، وتجنّب الأقسام الحرجة الطويلة.
- استخدم nonisolated للثوابت والمساعدات النقية.
- لا تخزّن حالة مشتركة قابلة للتغيير وغير قابلة لـ Sendable خارج actors، إذ ستتعلّم Sendable لاحقًا.
متطلب عزل actor
تحقق سريع: كيف تقرأ حالة actor أو تكتبها من خارجه؟
خلاصة
الخلاصة: تعزل actors الحالة القابلة للتغيير، ويتطلب الوصول الخارجي استخدام await. استخدم nonisolated للأعضاء النقية أو الثابتة، وصمّم أساليب async قصيرة للحفاظ على أمان إعادة الدخول.
الأسئلة الشائعة
هل درس «العوامل وعزل البيانات وnonisolated» مجاني؟
نعم — نص درس «العوامل وعزل البيانات وnonisolated» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.
ماذا ستتعلم في «العوامل وعزل البيانات وnonisolated»؟
تعلّم عزل actor: تكون الحالة محمية خلف actor ، ويتطلب الوصول بين العوامل استخدام await ، بينما تتجاوز الأعضاء nonisolated العزل عندما تكون نقية أو ساكنة. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.
كم من الوقت يستغرق درس «العوامل وعزل البيانات وnonisolated»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- TaskGroup للتنفيذ المتوازي
- العوامل وعزل البيانات وnonisolated
- Sendable والتحقق من أمان الخيوط