Swift + Boas Práticas de organização de strings
Um bom método para organizar strings com diferentes propósitos em seus projetos iOS.
Quando estamos iniciando um novo projeto é muito comum você se perguntar sobre como seu projeto está organizado. Você está sempre tentando descobrir se está usando a melhor arquitetura, a melhor hierarquia de pastas … (bem, ao menos sempre acontece comigo).
Uma das coisas que me perguntava com frequência, era quanto a forma como organizava strings com diferentes finalidades dentro dos meus projetos.
“Devo criar uma constante para cada string dentro da classe onde esta string será usada?”
“Devo criar uma classe / estrutura onde todas as constantes de string estarão disponíveis dentro do aplicativo?”
E muitas outras opções …
… Neste ponto, você pode estar tentando entender por que escrevi “strings com finalidades diferentes”… então deixe-me explicar melhor.
Cada texto usado dentro de um aplicativo é armazenado em uma variável ou constante de string, mas nem todas as strings de um aplicativo são usadas ao mesmo tempo ou em uma mesma tela. Outras strings podem ser usadas internamente ou mesmo lidas pelo VoiceOver quando você está trabalhando com acessibilidade.
Seria uma boa ideia organizar essas strings para ajudá-lo a encontrar cada uma facilmente em seu projeto, certo?
Depois de tentar muitas soluções, finalmente cheguei ao método que mais gostei…LocalizableStrings
“Mas por que, como?”, Você pode estar pensando … bem, há duas razões simples, que são:
- Organização - Usando LocalizableStrings, você manterá seu código limpo;
- Escalabilidade - Quando seu aplicativo estiver crescendo muito você será grato por manter suas strings em um único lugar;
“Tudo bem, tudo bem, mas finalmente, como faço isso?”
Direito ao ponto…
Imagine que você está trabalhando em um projeto que implementa recursos de acessibilidade e tem algumas labels dentro de um ViewController que devem ser lidos pelo VoiceOver corretamente, mas o texto que será lido deve ser diferente daquele apresentado pelos labels.
“Eu apontaria diferentes string para cada propósito dentro do Controller”
Sério? e se eu disser que existe uma abordagem melhor para conseguir isso…
Para resolver o problema do exemplo anterior, você deve criar duas tabelas de LocalizableStrings em algum lugar do seu projeto, nomeie-as (imagine que você está trabalhando em um recurso de login):
- LoginStrings.strings (dê um bom nome)
- LoginAccessibilityStrings.strings (nome horrível, não é?)
Bom, a próxima etapa é mover todas as strings que você acabou de criar para a respectiva tabela de strings:
Bom, agora precisamos criar o código que representará a interface entre cada tabela de string com o código do projeto.
Para conseguir isso, você precisa criar alguns arquivos swift:
- LoginStrings.swift
- LoginAccessibilityStrings.swift
- FeatureKind.swift
LoginStrings e LoginAccessibilityStrings são enums que conterão casos para cada item nas tabelas de string.
Você pode notar que ambos os enums têm uma função chamada localized, esta função é responsável por retornar a string localizada de um determinado caso se ela existir na tabela de strings.
Também temos o enum FeatureKind, que será usado para apontar qual tabela de string deve ser usada, veja o código abaixo:
Acredito que neste ponto seu código deve estar exibindo um erro.
Sim, eu sei.
Isso está acontecendo porque esta implementação ainda precisa de alguma peça, então precisamos criar um novo arquivo swift chamado String+Localizable.swift, vamos extender a classe String e implementar uma função também chamada localized:
Como você pode notar, esta função é responsável por receber uma string e retornar a respectiva correspondência localizada em uma tabela de string.
”Oh cara, isso é mais difícil do que eu pensava”
Não, não é, você ainda precisa fazer uma pequena atualização em seu ViewController, ele deve ficar parecido com isto:
Agora terminamos, você pode executar seu aplicativo e tudo deve ficar bem.
Depois de todo esse código, o ponto é, agora seu projeto possui locais específicos para cada propósito de string em seu aplicativo, conforme seu projeto evolui qualquer novo desenvolvedor entenderá facilmente onde colocar ou encontrar strings, e o código manterá um sistema de tratamento de string único e uniforme.
Veja o exemplo completo em: https://github.com/pericles-jr/SampleLocalizedStrings