Swift Academy · Lektion

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.

Lektion 2 af 38 trin

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.

Gratis at komme i gang

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

  1. TaskGroup til parallelisering
  2. Actors og dataisolering, nonisolated
  3. Sendable og kontrol af trådsikkerhed
← Tilbage til Swift Academy