0Pricing
Swift Academy · Lezione

Actor e isolamento dei dati, nonisolated

Apprenda l'isolamento degli actor: lo stato è protetto dietro un actor , l'accesso tra actor richiede await e i membri nonisolated bypassano l'isolamento quando sono puri o statici.

Actor e isolamento dei dati, nonisolated è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 3 lezioni in totale.

Cosa offrono gli actor

Un actor protegge il proprio stato mutabile. Un solo task alla volta accede allo stato isolato; i chiamanti esterni devono usare await per i suoi metodi.

  • Isolamento = nessuna race sui dati
  • Le chiamate tra actor sono asincrone
  • nonisolated per membri puri o statici

Nozioni di base sugli actor

All'interno dell'actor, l'accesso è diretto. Dall'esterno, deve usare await sia per leggere sia per modificare lo stato isolato.

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
}

Garanzia di serializzazione

Anche se più task effettuano chiamate contemporaneamente, l'actor serializza l'accesso al proprio stato, impedendo le race.

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
}

API nonisolated

Contrassegni come nonisolated i membri puri o statici, così i chiamanti non devono usare await. Tali membri non devono accedere allo stato isolato.

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
}

Attenzione alla rientranza

Gli actor possono essere rientranti: dopo un await all'interno di un metodo dell'actor, possono essere elaborati altri messaggi. Mantenga valide le invarianti tra i punti di await.

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
}

Best practice

Linee guida:

  • Esponga piccoli metodi asincroni ed eviti sezioni critiche lunghe.
  • Utilizzi nonisolated per costanti e helper puri.
  • Non memorizzi stato mutabile condiviso non-Sendable al di fuori degli actor: imparerà a usare Sendable nella prossima lezione.

Requisito di isolamento degli actor

Verifica rapida: come si legge o modifica lo stato di un actor dall'esterno?

Riepilogo

Riepilogo: gli actor isolano lo stato mutabile; per accedervi dall'esterno è necessario usare await. Utilizzi nonisolated per i membri puri o statici e progetti metodi asincroni brevi per gestire in sicurezza la rientranza.

Domande Frequenti

La lezione «Actor e isolamento dei dati, nonisolated» è gratuita?

Sì — il testo completo di «Actor e isolamento dei dati, nonisolated» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 3 lezioni in totale.

Cosa imparerò in «Actor e isolamento dei dati, nonisolated»?

Apprenda l'isolamento degli actor: lo stato è protetto dietro un actor , l'accesso tra actor richiede await e i membri nonisolated bypassano l'isolamento quando sono puri o statici. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Actor e isolamento dei dati, nonisolated»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. TaskGroup per il parallelismo
  2. Actor e isolamento dei dati, nonisolated
  3. Sendable e controllo della thread safety
← Torna a Swift Academy