0Pricing
Swift Academy · Lección

Sendable y comprobación de seguridad de hilos

Marque los datos como Sendable , escriba cierres @Sendable y elija entre tipos valor, actores y @unchecked Sendable para compartir datos de forma segura entre hilos.

Sendable y comprobación de seguridad de hilos es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 3 lecciones en total.

¿Qué es Sendable?

Sendable es la forma de Swift de garantizar que los datos se puedan pasar de forma segura entre tareas o actores concurrentes.

  • La mayoría de las estructuras y enumeraciones son Sendable automáticamente.
  • Las clases no son Sendable de forma predeterminada.
  • Use actores o @unchecked Sendable (rara vez y con seguridad manual).

Los tipos de valor son sencillos

Las estructuras cuyos miembros son Sendable son Sendable; pasarlas entre tareas es seguro.

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

Clases: use actores

Los actores hacen que la semántica de referencia sea segura entre tareas al serializar el acceso.

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

Closures @Sendable

Marque los closures como @Sendable cuando puedan ejecutarse en otros ejecutores. Evite capturar estado mutable que no sea 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 (avanzado)

@unchecked Sendable desactiva las comprobaciones del compilador. Úselo únicamente con sincronización interna estricta (locks/queues) y como último recurso.

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

Prácticas recomendadas

Pautas:

  • Prefiera tipos de valor (compatibles con Sendable).
  • Use actores para el estado mutable compartido.
  • Escriba closures @Sendable; evite capturar variables mutables que no sean Sendable.
  • Use @unchecked Sendable únicamente con una sincronización rigurosa.

Significado de Sendable

Comprobación rápida: ¿Qué garantiza Sendable?

Repaso

Repaso: Use Sendable para modelar la seguridad entre tareas, prefiera actores o tipos de valor, escriba cierres @Sendable y reserve @unchecked Sendable únicamente para componentes internos bien sincronizados.

Preguntas frecuentes

¿La lección «Sendable y comprobación de seguridad de hilos» es gratis?

Sí — el texto completo de «Sendable y comprobación de seguridad de hilos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 3 lecciones en total.

¿Qué aprenderé en «Sendable y comprobación de seguridad de hilos»?

Marque los datos como Sendable , escriba cierres @Sendable y elija entre tipos valor, actores y @unchecked Sendable para compartir datos de forma segura entre hilos. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 3.

¿Cuánto tiempo toma la lección «Sendable y comprobación de seguridad de hilos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. TaskGroup para el paralelismo
  2. Actores, aislamiento de datos y nonisolated
  3. Sendable y comprobación de seguridad de hilos
← Volver a Swift Academy