Sendable e controllo della thread safety
Contrassegni i dati come Sendable , scriva closure @Sendable e scelga tra tipi valore, actor e @unchecked Sendable per la condivisione thread-safe.
Sendable e controllo della thread safety è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Che cos'è Sendable?
Sendable è il meccanismo di Swift per garantire che i dati possano essere passati in sicurezza tra task o actor concorrenti.
- La maggior parte delle struct e degli enum è automaticamente Sendable.
- Le classi non sono Sendable per impostazione predefinita.
- Utilizzi gli actor o @unchecked Sendable, raramente e con verifiche manuali della sicurezza.
I tipi valore sono semplici
Le struct con membri Sendable sono Sendable; passarle tra i task è sicuro.
// 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)
}Classi: utilizzi gli actor
Gli actor rendono sicura la semantica dei riferimenti tra i task serializzando l'accesso.
// 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.Closure @Sendable
Contrassegni le closure con @Sendable quando possono essere eseguite su altri executor. Eviti di catturare stato mutabile non-Sendable.
// 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 (avanzato)
@unchecked Sendable esclude i controlli del compilatore. Lo utilizzi solo con una sincronizzazione interna rigorosa, tramite lock o code, e come ultima risorsa.
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)
}Best practice
Linee guida:
- Preferisca i tipi valore, compatibili con Sendable.
- Utilizzi gli actor per lo stato mutabile condiviso.
- Scriva closure @Sendable ed eviti di catturare dati mutabili non-Sendable.
- Utilizzi @unchecked Sendable solo con una sincronizzazione rigorosa.
Significato di Sendable
Verifica rapida: Che cosa garantisce Sendable?
Riepilogo
Riepilogo: Usi Sendable per modellare la sicurezza tra task, preferisca actors o tipi valore, scriva closure @Sendable e riservi @unchecked Sendable esclusivamente agli elementi interni sincronizzati correttamente.
Domande Frequenti
La lezione «Sendable e controllo della thread safety» è gratuita?
Sì — il testo completo di «Sendable e controllo della thread safety» è 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 «Sendable e controllo della thread safety»?
Contrassegni i dati come Sendable , scriva closure @Sendable e scelga tra tipi valore, actor e @unchecked Sendable per la condivisione thread-safe. 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 3 di 3.
Quanto tempo richiede la lezione «Sendable e controllo della thread safety»?
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
- TaskGroup per il parallelismo
- Actor e isolamento dei dati, nonisolated
- Sendable e controllo della thread safety