Swift Sendable: Segurança em Concorrência
Swift Interview Question: What is Sendable in Swift?
Infografia completa sobre o protocolo Sendable, incluindo conceitos fundamentais, casos de uso, implementação e boas práticas para garantir segurança na transferência de dados entre contextos de concorrência.
A infografia aborda:
- Definição e propósito do protocolo
- Por que Swift introduziu o
Sendable - Tipos que conformam automaticamente
- Como tornar uma classe
Sendable - Exemplos práticos de código
- Consequências quando uma classe não é
Sendable - Padrão mental e dicas de entrevista
Sendable e @Sendable Closures Explicados com Código
O protocolo Sendable indica se a API pública de um valor é thread-safe e pode ser usada com segurança entre domínios de concorrência. Uma API pública é segura quando não possui mutadores públicos, implementa um sistema interno de locking ou usa copy-on-write (comum em tipos de valor). Muitos tipos da biblioteca padrão já conformam a Sendable, e o compilador pode inferir conformance implicitamente para tipos customizados.
A conformance deve ocorrer no mesmo arquivo de origem para que o compilador possa verificar todos os membros visíveis. Para classes mutáveis com mecanismos internos de sincronização, use @unchecked para indicar que a classe é thread-safe.
O que significa “Sendable”? – Discussão Swift Forums
A interpretação formal de “Sendable” é “pode ser transferido entre domínios de concorrência”. Um tipo é Sendable se qualquer programa mutable que acessa não encontra data races. Um tipo pode conformar se: (1) não possui estado mutável, (2) possui estado mutável mas = cria uma cópia que não compartilha com o original, ou (3) possui estado mutável mas com sincronização apropriada (como @MainActor, copy-on-write, atômicos ou locks privados).
Se um tipo não conforma automaticamente, ele possui propriedades stored cujos tipos não são Sendable. A abordagem é auditar cada um individualmente.
Dominando Swift Concurrency: Um Guia para Sendable
O protocolo Sendable marca tipos que podem ser transferidos com segurança entre limites de concorrência. Tipos de valor como structs e enums conformam facilmente se todas as propriedades são Sendable.
Classes requerem mais cuidado:
- Opção 1: Tornar a classe final com propriedades imutáveis
- Opção 2: Usar
@unchecked Sendablecom locks (NSLock, etc.)
Para migrar código existente:
- Auditar tipos que cruzam limites de actor ou task
- Começar com tipos de folha simples e avançar para tipos complexos
- Usar
@preconcurrencypara adoção gradual - Ativar “Strict Concurrency Checking” nas configurações de build
- Converter propriedades mutáveis em imutáveis ou usar actors
- Testar extensivamente
What is the Sendable Protocol in Swift? | Swift Concurrency #11
O protocolo Sendable é simples: indica se um objeto é seguro para enviar em um contexto assíncrono. Para fins práticos, significa se é seguro enviar um objeto para um Actor.
O Sendable indica que um valor de um tipo pode ser usado com segurança em código concorrente. Para classes Sendable, é essencial que sejam final e que todas as propriedades sejam imutáveis.
Sendable e @Sendable Closures – Disponível a partir de Swift 5.5
A SE-0302 adiciona suporte para “sendable data”, dados que podem ser transferidos com segurança para outra thread através do protocolo Sendable e do atributo @Sendable para funções.
Muitos tipos são inerentemente seguros para enviar: Bool, Int, String, Array<String>, Dictionary<Int, String> e outros. Para tipos customizados:
- Structs/enums:
Sendablese contêm apenas valoresSendable - Classes:
Sendablese herdam apenas deNSObjectou nada, todas as propriedades são constantesSendable, e marcadas comofinal - Closures: Use
@Sendablepara indicar que funcionam concorrentemente
Dominando Sendable em Swift 6
Sendable é o sistema de Swift para garantir segurança de dados entre limites de tarefa através de verificações em tempo de compilação. Para conformidade explícita em tipos complexos, marque propriedades como imutáveis ou envolva propriedades mutáveis em actors. Ao conformar, seja preciso: verifique tipos aninhados e se há propriedades mutáveis, considere marcar a classe como final.
Para objetos que compartilham estado mutável (cache, session handler), use um actor para torná-lo Sendable.
Enviando vs. @Sendable em Swift 6
O @Sendable em closures ajuda o compilador a garantir que certos closures capturem apenas estado que pode ser usado com segurança de múltiplas tasks ou contextos de isolamento.
Swift 6 introduz a keyword sending que pode ser aplicada a closures, permitindo que o compilador garanta que estado capturado não seja acessado após ser transferido para novo contexto.
Regra Prática para Conformar a Sendable
- Padrão para Structs ou Enums
- Para estado mutável compartilhado, use um Actor
- Para estado imutável compartilhado, use uma classe final com propriedades
let - Use
@unchecked Sendableapenas se implementar manualmente locks de thread e documentar a sincronização
Entendendo Sendable em Swift: Dominando Segurança de Concorrência
Um “domínio de concorrência” em Swift é um contexto de execução isolado, como um Actor ou Task. Quando você passa um objeto de um domínio para outro (ex: em Task.detached ou enviando para um actor), cruza um limite. Sendable é um protocolo marcador que diz ao compilador: “Este tipo é seguro para ser compartilhado concorrentemente.”
Tipos de valor são inerentemente seguros porque são copiados quando passados. Se um struct ou enum é composto inteiramente de propriedades Sendable, Swift implicitamente torna o struct inteiro Sendable. Tipos de referência (classes) não são implicitamente Sendable porque compartilham referência.