O Swift 6 apresenta melhorias importantes, como atores para concorrência segura, erros tipados para tratamento de erros mais claro e aumentos de desempenho por meio de tipos não copiáveis. Saiba como esses recursos aumentam a produtividade e expandem os recursos do Swift em todas as plataformas.
Swift 6 – Atores
Atores permitem que os desenvolvedores criem domínios isolados onde propriedades e métodos são protegidos de acesso simultâneo. Todas as propriedades armazenadas dentro de um ator são confinadas à instância específica do ator, garantindo um manuseio mais seguro de dados compartilhados em ambientes multithread.
ator Ilha {
var rebanho: [ Frango ]
var comida: [ Abacaxi ]
func addToFlock () {
rebanho.append( Frango ())
}
}
Cada Island
instância neste exemplo cria seu próprio domínio de isolamento para proteger o acesso às suas propriedades, com o addToFlock
método isolado para essa instância. Métodos dentro do mesmo domínio podem acessar dados compartilhados de forma síncrona. O isolamento de ator pode ser desativado quando você precisa organizar o código dentro de um ator, mas não requer isolamento estrito. No entanto, métodos não isolados não podem acessar de forma síncrona o estado protegido.
ator Ilha {
var rebanho: [ Frango ]
var comida: [ Abacaxi ]
não isolado func canGrow () -> PlantSpecies {
// nem rebanho nem comida são acessíveis aqui
}
}
O domínio de isolamento de um ator se estende além de seus próprios métodos. Funções que tomam um parâmetro isolado podem acessar o estado do ator sem precisar de mecanismos extras de sincronização.
func addToFlock ( de ilha : ilha isolada ) { ilha.flock.append( Chicken ()) }
Para uma visão geral dos atores, consulte a seção Atores da Linguagem de Programação Swift.
Atores globais
Atores globais compartilham todas as propriedades de atores regulares, mas também fornecem um meio de atribuir estaticamente declarações ao seu domínio de isolamento. Isso é feito com uma anotação que corresponde ao nome do ator. Atores globais são particularmente úteis quando grupos de tipos precisam interoperar como um único pool de estado mutável compartilhado.
@MainActor
classe ChickenValley {
var rebanho: [ Frango ]
var comida: [ Abacaxi ]
}
Esta classe é estaticamente isolada para MainActor
. Isso garante que todo acesso ao seu estado mutável seja feito a partir desse domínio de isolamento.
Você também pode optar por não participar desse tipo de isolamento de ator, usando a nonisolated
palavra-chave. E assim como com os tipos de ator, fazer isso não permitirá o acesso a nenhum estado protegido.
@MainActor
class ChickenValley {
var flock: [ Chicken ]
var food: [ Pineapple ]
não isolado func canGrow () -> PlantSpecies {
// nem flock, food, nem qualquer outro
estado isolado do MainActor está acessível aqui
}
}
Fique ligado neste post para mais atualizações. Para saber mais sobre este tópico, recomendo ler Migrating to Swift 6 / Data Race Safety .