Swift Academy · Leçon

Sendable et vérification de la sécurité des threads

Marquez les données comme Sendable , écrivez des fermetures @Sendable et choisissez entre les types valeur, les acteurs et @unchecked Sendable pour un partage sûr entre threads.

Leçon 3 sur 38 étapes

Sendable et vérification de la sécurité des threads est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 3. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 3 leçons au total.

Qu’est-ce que Sendable ?

Sendable est le mécanisme de Swift qui garantit que les données peuvent être transmises en toute sécurité entre les tâches et les acteurs concurrents.

  • La plupart des structures et énumérations sont automatiquement Sendable.
  • Les classes ne sont pas Sendable par défaut.
  • Utilisez des acteurs ou @unchecked Sendable (rarement, avec une sécurité gérée manuellement).

Les types valeur sont simples

Les structures dont les membres sont Sendable sont Sendable ; les transmettre entre les tâches est sûr.

// 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)
}

Classes : utilisez des acteurs

Les acteurs rendent les sémantiques de référence sûres entre les tâches en sérialisant les accès.

// 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.

Fermetures @Sendable

Marquez les fermetures avec @Sendable lorsqu’elles peuvent s’exécuter sur d’autres exécuteurs. Évitez de capturer un état mutable 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 (avancé)

@unchecked Sendable désactive les vérifications du compilateur. Utilisez-le uniquement avec une synchronisation interne stricte (verrous ou files d’attente), en dernier recours.

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)
}

Bonnes pratiques

Recommandations :

  • Préférez les types valeur (compatibles avec Sendable).
  • Utilisez les acteurs pour l’état mutable partagé.
  • Écrivez des fermetures @Sendable ; évitez de capturer des valeurs mutables non-Sendable.
  • Utilisez @unchecked Sendable uniquement avec une synchronisation rigoureuse.

Signification de Sendable

Vérification rapide : que garantit Sendable ?

Récapitulatif

Récapitulatif : utilisez Sendable pour modéliser la sécurité entre tâches, privilégiez les acteurs ou les types valeur, écrivez des fermetures @Sendable et réservez @unchecked Sendable aux implémentations internes correctement synchronisées.

Gratuit pour commencer

Apprends Swift avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
122
Leçons
409

Questions Fréquemment Posées

La leçon « Sendable et vérification de la sécurité des threads » est-elle gratuite ?

Oui — le texte complet de « Sendable et vérification de la sécurité des threads » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 3 leçons au total.

Qu'est-ce que j'apprendrai dans « Sendable et vérification de la sécurité des threads » ?

Marquez les données comme Sendable , écrivez des fermetures @Sendable et choisissez entre les types valeur, les acteurs et @unchecked Sendable pour un partage sûr entre threads. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 3.

Combien de temps prend la leçon « Sendable et vérification de la sécurité des threads » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. TaskGroup pour le parallélisme
  2. Acteurs et isolation des données, nonisolated
  3. Sendable et vérification de la sécurité des threads
← Retour à Swift Academy