iOS

29 jan, 2025

Swift 6: Segurança na Corrida de Dados — Atores

Publicidade

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 Islandinstância neste exemplo cria seu próprio domínio de isolamento para proteger o acesso às suas propriedades, com o addToFlockmé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 nonisolatedpalavra-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 .