Actor-Isolation und nonisolated
Analysieren Sie Grenzen der Isolation.
Actor-Isolation und nonisolated ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. 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 4 Lektionen.
Was ist Actor-Isolation?
Actor-Isolation bedeutet, dass der veränderliche Zustand eines Actors nur von Code verändert werden kann, der auf diesem Actor ausgeführt wird.
Die Laufzeitumgebung serialisiert den Zugriff, sodass niemals zwei Tasks gleichzeitig den Zustand verändern und dadurch Datenrennen vermieden werden.
actor Counter {
private var value = 0
func increment() { value += 1 }
}Aufrufen eines Actors
Beim Zugriff von außerhalb des Actors auf isolierte Member ist der Zugriff asynchron. Sie müssen await verwenden, da der Aufruf angehalten werden kann, bis der Actor frei ist.
let counter = Counter()
func useCounter() async {
await counter.increment()
}Im Actor: synchron
Innerhalb der eigenen Methoden des Actors sind Sie bereits isoliert. Daher greifen Sie synchron auf den Zustand zu – für self ist kein await erforderlich.
actor Counter {
private var value = 0
func incrementTwice() {
value += 1 // synchronous: already isolated
value += 1
}
}nonisolated-Member
Markieren Sie ein Member mit nonisolated, wenn es nicht auf veränderlichen Zustand zugreift. Solche Member werden von überall synchron und ohne await ausgeführt.
Das ist ideal für berechnete Werte, die ausschließlich aus unveränderlichen Daten gebildet werden.
actor User {
let id: Int
var sessionCount = 0
init(id: Int) { self.id = id }
nonisolated var label: String { "User #\(id)" }
}Warum nonisolated sicher ist
Ein nonisolated-Member darf nur unveränderlichen (let) oder anderweitig Sendable-Zustand lesen.
Der Compiler lehnt jeden Versuch ab, aus einem nonisolated-Kontext auf veränderlichen isolierten Zustand zuzugreifen.
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 und Protokolle
nonisolated ist unverzichtbar, wenn ein Actor einem synchronen Protokoll entspricht. Die Protokollmethode kann nicht async sein und darf daher nicht auf isolierten Zustand zugreifen.
actor Item: CustomStringConvertible {
let name: String
init(name: String) { self.name = name }
nonisolated var description: String { "Item: \(name)" }
}Der MainActor
@MainActor ist ein globaler Actor, der Code auf den Hauptthread isoliert. UI-Aktualisierungen gehören hierher.
Markieren Sie Typen, Methoden oder Eigenschaften, um sie an den MainActor zu binden.
@MainActor
final class ViewModel {
var title = "Hello"
func refresh() { title = "Updated" }
}Wechsel zwischen Actors
Wenn Sie von einem Actor zu einem anderen aufrufen, wechselt die Laufzeitumgebung den Executor und hält die Ausführung an. Genau an dieser Unterbrechung wird await verwendet.
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-Reentranz
Actors sind reentrant: Wenn eine Methode auf await wartet, kann der Actor andere anstehende Arbeit ausführen, bevor die Ausführung nach dem await fortgesetzt wird.
Vor einem await gelesener Zustand kann sich danach geändert haben. Überprüfen Sie Annahmen nach Unterbrechungspunkten erneut.
actor Store {
var ready = false
func prepare() async {
ready = false
await Task.yield() // other calls may run here
ready = true
}
}isolated-Parameter
Eine Funktion kann einen isolated-Actor-Parameter annehmen und ihren Funktionskörper auf diesem Actor ausführen, ohne selbst ein Member des Actors zu sein.
func bump(on counter: isolated Counter) {
// runs isolated to counter; synchronous access
}Globale Actors für Subsysteme
Sie können einen eigenen globalen Actor definieren, um ein gesamtes Subsystem (z. B. eine Rendering-Pipeline) auf einem einzigen Executor zu isolieren.
@globalActor
actor RenderActor {
static let shared = RenderActor()
}
@RenderActor func draw() { }Schnelltest: Isolation
Testen Sie Ihr Verständnis der Actor-Isolation.
Zusammenfassung: Actor-Isolation und nonisolated
Actor-Isolation serialisiert den Zugriff auf veränderlichen Zustand; Aufrufe zwischen Actors sind asynchron und erfordern await. nonisolated-Member umgehen die Isolation, dürfen aber nur auf unveränderlichen oder Sendable-Zustand zugreifen. Das ist für die Konformität zu synchronen Protokollen unerlässlich.
@MainActor bindet Code an den Hauptthread, Actors sind reentrant (Zustand kann sich zwischen zwei await-Punkten ändern), und globale Actors isolieren ganze Subsysteme. Die Beherrschung dieser Regeln ist der Kern sicherer Nebenläufigkeit.
Häufig gestellte Fragen
Ist die Lektion „Actor-Isolation und nonisolated“ kostenlos?
Ja — der vollständige Text von „Actor-Isolation und nonisolated“ 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 4 Lektionen.
Was lerne ich in „Actor-Isolation und nonisolated“?
Analysieren Sie Grenzen der Isolation. 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 4.
Wie lange dauert die Lektion „Actor-Isolation und nonisolated“?
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
- Das Data-Race-Problem
- Das Sendable-Protocol
- Actor-Isolation und nonisolated
- Auf Strict Concurrency migrieren