Quantos reais mesmo? Papo de acessibilidade e swift.

Eduardo Lombardi
3 min readMay 1, 2023
Photo by Alexander Grey on Unsplash

Experimente criar um projeto novo no Xcode, colocar uma UILabel acessível em uma tela e colocar o conteúdo "R$ 23,50" nela. Agora rode o app no seu dispositivo físico e ative o voice over para testar a experiência.

  • "Real 23,50"

Peraí, tem algo errado. Cadê os centavos? E os reais? real? Agora vamos extrapolar isso para um texto que esteja em um JSON montado no servidor backend do app. Bug na certa. Neste artigo mostro uma possível solução para o problema, mas já adianto que não vou mostrar a solução completa, vou dar dicas e deixar que você leitor crie sua resposta.

Para resolver o problema, devemos pensar um pouco como a Apple. Eles tem tratamento no foundation para quase tudo que você imaginar, e com valores monetários não seria diferente. Para que um texto monetário funcione corretamente (Ou seja falado corretamente no leitor de acessibilidade dentro de uma UILabel), devemos utilizar o formatador presente em https://developer.apple.com/documentation/foundation/numberformatter/style/currency, que também vai exigir um locale (para reproduzir reais e dólares por exemplo). Só que esse formatador exige um número (que pode ser um Double) para o seu funcionamento.

Para que a solução completa funciona, podemos utilizar alguma estrutura que seja como:

O que falta fazer aqui para que essa estrutura funcione é um código, que pode ser em uma extension de String para separar os tokens presentes no texto (como o {0} do exemplo) e substituir pelo valor correspondente no array de values (value[0]) no exemplo. Este é um excelente caso de uso para expressões regulares. As expressões regulares são padrões de caracteres que associam sequências de caracteres no texto. Através de um código que lide com regex simples em swift, você consegue procurar pelos tokens {0} e substitui-los pelo valor correspondente já com a acessibilidade certinha. Vou aqui deixar apenas um pedaço do mesmo, o resto fica de lição de casa para você procurar e tentar fazer. Abra um playground do xcode e tente implementar esta solução.

Deixei a implementação do formatador mostrado acima dentro de uma extension, para facilitar o uso, assim podemos chamar currencyString em qualquer valor Double que tivermos.

Solução feita, o resultado deverá ser: (voice over ativado);

"23 reais e 50 centavos"

--

--