O Embedded Swift é um subconjunto do Swift projetado para uso com baixo consumo de recursos, tornando-o capaz de rodar em ambientes restritos como microcontroladores. Usando um modo especial de compilação, o Embedded Swift produz binários significativamente menores que o Swift regular. Embora seja um subconjunto da linguagem completa, a grande maioria do Swift funciona exatamente da mesma forma no Embedded Swift. Informações adicionais são descritas no documento de visão do Embedded Swift.
O Embedded Swift está evoluindo rapidamente. Após as atualizações sobre melhorias do Embedded Swift no Swift 6.3 no final do ano passado, este post descreve uma série de melhorias adicionais feitas na próxima versão Swift 6.4. Você pode experimentá-las hoje com um snapshot de desenvolvimento Swift.
O Embedded Swift continua a expandir seu subconjunto da linguagem para incluir mais aspectos do “Swift completo”, tornando cada vez mais fácil trazer compatibilidade com o Embedded Swift para bases de código existentes. Muitas dessas funcionalidades têm algum aspecto dinâmico, significando que elas afetam o desempenho em tempo de execução (por exemplo, devido a chamadas indiretas) e o tamanho do código (devido à necessidade de metadados adicionais). No entanto, esse impacto ocorre apenas onde esses recursos dinâmicos da linguagem são realmente usados: códigos que são altamente sensíveis ao tamanho do código e desempenho podem escolher evitar essas funcionalidades, por exemplo, ativando avisos no grupo de diagnósticos PerformanceHints.
O Embedded Swift anteriormente suportava apenas tipos existenciais (any) que tinham uma restrição AnyObject, significando que eles só podiam ser usados com instâncias de classe. Agora, todos os tipos any estão disponíveis no Embedded Swift, incluindo o próprio Any. Por exemplo:
protocol P {
func method()
}
extension Int: P {
func method() { print("\(self) está aqui") }
}
let a: any P = 17
a.method() // imprime "17 está aqui"
O modelo de compilação genérica do Embedded Swift, que exige que todas as funções e tipos genéricos eventualmente sejam especializados, implica algumas limitações no uso de tipos any. Especificamente, uma função genérica não pode ser chamada em um tipo any:
extension P {
func genericMethod<T: P>(_ other: T) { ... }
}
let a: any P = 17
a.genericMethod(a) // erro: não é possível usar o método genérico de instância 'genericMethod' em um valor do tipo 'any P' no Embedded Swift
O Embedded Swift anteriormente permitia apenas lançar tipos específicos de erros, como este:
func parseRecord() throws(ParsingError) -> Record { ... }
O lançamento de erros “sem tipo”, que pode lançar qualquer instância Error-conforme, era anteriormente desabilitado no Embedded Swift:
func loadImage() throws -> Image { ... } // anteriormente desabilitado no Embedded Swift
O lançamento de erros sem tipo é equivalente ao lançamento de um valor do tipo any Error. Com a generalização dos tipos any, o Embedded Swift agora suporta completamente os lançamentos sem tipo. Lançar um valor de any Error geralmente requer uma alocação em pilha, então lançamentos com tipos ainda devem ser preferidos para bases de código que desejam evitar alocações em pilha.
O Swift embutido tradicionalmente permitiu metatipos (por exemplo, let task = Task {
if badThing {
throw MyError.badThingHappened
}
return "ok"
}
print(try await task.value)
O suporte ao Swift Embedded está disponível nos snapshot de desenvolvimento do Swift. A melhor maneira de começar é através dos exemplos no repositório Swift Embedded Examples, que contém vários projetos de amostra para ajudar a construir e executar código Swift Embedded em diferentes hardware.
Se você tiver perguntas sobre as melhorias descritas aqui ou quiser discutir seu próprio trabalho com Swift Embedded, encorajamos você a participar da conversa nos fóruns do Swift. Você pode fazer perguntas sobre este post na thread associada e compartilhar suas experiências na categoria Swift Embedded.

