Actors og dataisolering, nonisolated
Lær om actor-isolering: tilstand beskyttes bag en actor , adgang på tværs af actors kræver await , og nonisolated -medlemmer omgår isoleringen, når de er rene eller statiske.
Actors og dataisolering, nonisolated er en gratis Swift Academy-lektion på CoddyKit. Dette er lektion 2 af 3. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Swift Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Swift Academy-kurset indeholder 3 lektioner i alt.
Hvad aktører tilbyder
En aktør beskytter sin foranderlige tilstand. Kun én opgave ad gangen tilgår den isolerede tilstand, og eksterne kaldere skal bruge await på dens metoder.
- Isolation = ingen datakapløb
- Kald på tværs af aktører er asynkrone
- nonisolated til rene eller statiske medlemmer
Grundlæggende om aktører
Inde i aktøren er adgangen direkte. Udefra skal du bruge await ved både læsning og skrivning af isoleret tilstand.
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
}Garanti for serialisering
Selv hvis flere opgaver kalder samtidigt, serialiserer aktøren adgangen til sin tilstand og forhindrer dermed kapløb.
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'er
Markér medlemmer som nonisolated, når de er rene eller statiske, så kaldere ikke behøver await. De må ikke tilgå isoleret tilstand.
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
}Opmærksomhed på genindtræden
Aktører kan være genindtrædende: Efter et await i en aktørmetode kan andre beskeder blive behandlet. Sørg for, at invariansbetingelserne er gyldige på tværs af await-punkter.
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
}Bedste praksis
Retningslinjer:
- Eksponér små asynkrone metoder, og undgå lange kritiske sektioner.
- Brug nonisolated til konstanter og rene hjælpefunktioner.
- Gem ikke delt, foranderlig tilstand, der ikke er Sendable, uden for aktører (du lærer om Sendable i næste lektion).
Krav til aktørisolering
Hurtigt tjek: Hvordan læser eller skriver du aktørens tilstand udefra?
Opsummering
Opsummering: Aktører isolerer foranderlig tilstand, og ekstern adgang kræver await. Brug nonisolated til rene eller statiske medlemmer, og udform korte asynkrone metoder for at gøre genindtræden sikker.
Lær Swift med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 122
- Lektioner
- 409
Ofte stillede spørgsmål
Er lektionen “Actors og dataisolering, nonisolated” gratis?
Ja — alle 3 lektioner i læringssporet Swift Academy, inklusive “Actors og dataisolering, nonisolated”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Swift Academy-kurset indeholder 3 lektioner i alt.
Hvad lærer jeg i “Actors og dataisolering, nonisolated”?
Lær om actor-isolering: tilstand beskyttes bag en actor , adgang på tværs af actors kræver await , og nonisolated -medlemmer omgår isoleringen, når de er rene eller statiske. Du øver dig i Swift Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Swift Academy?
Der kræves ingen tidligere erfaring. Swift Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 3.
Hvor lang tid tager lektionen “Actors og dataisolering, nonisolated”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Swift Academy-lektion?
Ja. Alle Swift Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- TaskGroup til parallelisering
- Actors og dataisolering, nonisolated
- Sendable og kontrol af trådsikkerhed