Sendable und Prüfung der Thread-Sicherheit
Kennzeichnen Sie Daten als Sendable , schreiben Sie @Sendable -Closures und wählen Sie für das threadsichere Teilen zwischen Value Types, Actors und @unchecked Sendable .
Sendable und Prüfung der Thread-Sicherheit ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Was ist Sendable?
Sendable ist Swifts Möglichkeit, sicherzustellen, dass Daten zwischen nebenläufigen Tasks und Actors sicher übergeben werden können.
- Die meisten Structs und Enums sind automatisch Sendable.
- Classes sind standardmäßig nicht Sendable.
- Verwenden Sie Actors oder @unchecked Sendable (selten und nur mit manuell gewährleisteter Sicherheit).
Value Types sind unkompliziert
Structs mit Sendable-Membern sind Sendable; sie können sicher zwischen Tasks übergeben werden.
// 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)
}Classes: Verwenden Sie Actors
Actors machen Referenzsemantik über Tasks hinweg sicher, indem sie den Zugriff serialisieren.
// 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-Closures
Kennzeichnen Sie Closures mit @Sendable, wenn sie auf anderen Executoren ausgeführt werden können. Vermeiden Sie das Erfassen von veränderlichem Zustand, der nicht Sendable ist.
// 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 (fortgeschritten)
@unchecked Sendable deaktiviert die Prüfungen des Compilers. Verwenden Sie es nur mit strikter interner Synchronisierung (Locks oder Queues) und als letzten Ausweg.
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)
}Bewährte Vorgehensweisen
Richtlinien:
- Bevorzugen Sie Value Types, die sich gut für Sendable eignen.
- Verwenden Sie Actors für gemeinsam genutzten veränderlichen Zustand.
- Schreiben Sie @Sendable-Closures und vermeiden Sie das Erfassen veränderlicher Werte, die nicht Sendable sind.
- Verwenden Sie @unchecked Sendable nur mit rigoroser Synchronisierung.
Bedeutung von Sendable
Kurzprüfung: Was verspricht Sendable?
Zusammenfassung
Zusammenfassung: Verwenden Sie Sendable, um die Sicherheit über Task-Grenzen hinweg zu modellieren, bevorzugen Sie actors oder Werttypen, schreiben Sie @Sendable-Closures und verwenden Sie @unchecked Sendable ausschließlich für gut synchronisierte interne Implementierungen.
Häufig gestellte Fragen
Ist die Lektion „Sendable und Prüfung der Thread-Sicherheit“ kostenlos?
Ja — der vollständige Text von „Sendable und Prüfung der Thread-Sicherheit“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Sendable und Prüfung der Thread-Sicherheit“?
Kennzeichnen Sie Daten als Sendable , schreiben Sie @Sendable -Closures und wählen Sie für das threadsichere Teilen zwischen Value Types, Actors und @unchecked Sendable . Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 3.
Wie lange dauert die Lektion „Sendable und Prüfung der Thread-Sicherheit“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- TaskGroup für Parallelität
- Actors und Datenisolierung, nonisolated
- Sendable und Prüfung der Thread-Sicherheit