Sendable والتحقق من أمان الخيوط
وسِم البيانات بأنها Sendable ، واكتب إغلاقات @Sendable ، واختر بين أنواع القيم والعوامل و @unchecked Sendable للمشاركة الآمنة بين الخيوط.
Sendable والتحقق من أمان الخيوط درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.
ما هو Sendable؟
يمثّل Sendable آلية Swift لضمان أمان تمرير البيانات بين المهام المتزامنة وactors.
- تكون معظم الهياكل والتعدادات Sendable تلقائيًا.
- الفئات ليست Sendable افتراضيًا.
- استخدم actors أو @unchecked Sendable، وهو خيار نادر يتطلب ضمان السلامة يدويًا.
أنواع القيمة سهلة
تكون الهياكل التي تحتوي على أعضاء Sendable قابلةً للإرسال، ويكون تمريرها بين المهام آمنًا.
// Value types with value-only stored properties are Sendable.
// They are safe to transfer across tasks.
struct Point: Sendable { let x: Int; let y: Int }
func shift(_ p: Point) -> Point { Point(x: p.x + 1, y: p.y + 1) }
// Use in parallel tasks
Task {
let p = Point(x: 1, y: 2)
async let a = shift(p)
async let b = shift(p)
let (p1, p2) = await (a, b)
print(p1, p2) // Point(x: 2, y: 3) Point(x: 2, y: 3)
}الفئات: استخدم actors
تجعل actors دلالات المراجع آمنة عبر المهام من خلال تسلسل الوصول.
// Reference types (class) are not Sendable by default.
// Prefer actors to guard mutable state.
actor SafeCounter {
private var value = 0
func inc() { value += 1 }
func read() -> Int { value }
}
let counter = SafeCounter()
Task {
async let t1 = counter.inc()
async let t2 = counter.inc()
_ = await (t1, t2)
print(await counter.read()) // 2
}
// (Alternative) A plain class would need locks + @unchecked Sendable; see later.إغلاقات @Sendable
ضع وسم @Sendable على الإغلاقات عندما يحتمل تشغيلها على منفّذات أخرى. وتجنّب التقاط حالة قابلة للتغيير وغير Sendable.
// Some APIs require closures to be @Sendable so captured values are safe.
func doTwice(_ f: @Sendable () -> Int) -> Int { f() + f() }
let base = 10
// Capturing an immutable value (let) is fine for @Sendable closures.
let result = doTwice { base + 1 }
print(result) // 22
// Detached tasks also use @Sendable under the hood:
let t = Task.detached { () -> Int in
// Do not capture non-Sendable mutable state here.
return 5 * 5
}
Task { print(await t.value) }@unchecked Sendable (متقدم)
يتجاوز @unchecked Sendable فحوصات المترجم. استخدمه فقط مع مزامنة داخلية صارمة، مثل الأقفال أو قوائم الانتظار، وكحل أخير.
import Foundation
// Only when you KNOW it is safe: wrap with a lock and mark @unchecked Sendable.
final class Box<T>: @unchecked Sendable {
private var value: T
private let lock = NSLock()
init(_ value: T) { self.value = value }
func read() -> T {
lock.lock(); defer { lock.unlock() }
return value
}
func write(_ newValue: T) {
lock.lock(); value = newValue; lock.unlock()
}
}
let shared = Box<Int>(0)
let a = Task.detached { shared.write(1) }
let b = Task.detached { shared.write(2) }
Task {
_ = await (a.value, b.value)
print(shared.read()) // 1 or 2 (last writer wins, but no data race)
}أفضل الممارسات
إرشادات:
- فضّل أنواع القيمة الملائمة لـ Sendable.
- استخدم actors للحالة المشتركة القابلة للتغيير.
- اكتب إغلاقات @Sendable، وتجنّب التقاط القيم القابلة للتغيير وغير Sendable.
- استخدم @unchecked Sendable فقط مع مزامنة صارمة.
معنى Sendable
تحقق سريع: ما الذي يضمنه Sendable؟
مراجعة
مراجعة: استخدم Sendable لنمذجة السلامة بين المهام، وفضّل actors أو أنواع القيم، واكتب إغلاقات @Sendable، ولا تستخدم @unchecked Sendable إلا للأجزاء الداخلية المتزامنة جيدًا.
الأسئلة الشائعة
هل درس «Sendable والتحقق من أمان الخيوط» مجاني؟
نعم — نص درس «Sendable والتحقق من أمان الخيوط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.
ماذا ستتعلم في «Sendable والتحقق من أمان الخيوط»؟
وسِم البيانات بأنها Sendable ، واكتب إغلاقات @Sendable ، واختر بين أنواع القيم والعوامل و @unchecked Sendable للمشاركة الآمنة بين الخيوط. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.
كم من الوقت يستغرق درس «Sendable والتحقق من أمان الخيوط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- TaskGroup للتنفيذ المتوازي
- العوامل وعزل البيانات وnonisolated
- Sendable والتحقق من أمان الخيوط