String para Int em Swift: do básico ao performático
\n\nTodo desenvolvedor iOS, mais cedo ou mais tarde, enfrenta uma tarefa aparentemente simples: transformar uma string em número. Parece fácil — Int("42") e pronto. Mas quando o aplicativo processa milhares de strings, faz parsing de logs JSON ou lê entradas do usuário, a performance dessa operação se torna crítica.
Neste artigo, não vamos apenas mostrar como converter String para Int em Swift, mas também faremos uma verdadeira investigação: qual método é mais rápido, quais armadilhas estão escondidas no código simples e como escrever código Swift otimizado que não te decepcione em produção.
\n\nO conteúdo é baseado em uma pergunta popular do Stack Overflow (milhares de visualizações) e adaptado para o portal educacional PythonLib. Vamos nessa!
\n\n1. Método básico: Int(string)
\n\nA maneira mais óbvia e recomendada pela Apple é usar o inicializador Int(String). Ele retorna um valor opcional Int?, o que é seguro: se a string não for um número, você recebe nil.
let stringNumber = "123"\nif let number = Int(stringNumber) {\n print("Número: \\(number)")\n} else {\n print("Falha ao converter")\n}\n\nVantagens:
\n- \n
- Legibilidade do código — a melhor entre todas as opções. \n
- Segurança — o opcional protege contra crashes. \n
- Suporte a diferentes bases numéricas:
Int("FF", radix: 16). \n
Desvantagens:
\n- \n
- Performance — em operações em massa, pode ser um gargalo. \n
- Não lida com espaços, símbolos de moeda ou números localizados. \n
Este método é ideal para 90% dos casos. Mas se você está escrevendo um parser de logs ou processando arquivos CSV com um milhão de linhas, continue lendo.
\n\n2. Usando NumberFormatter: para strings "sujas"
\n\nO mundo real não é perfeito. O usuário pode digitar " 42 ", "$100" ou "1 234,56". É aí que entra o NumberFormatter — uma ferramenta poderosa, mas lenta.
let formatter = NumberFormatter()\nformatter.numberStyle = .decimal\n\nif let number = formatter.number(from: " 1 234 ")?.intValue {\n print(number) // 1234\n}\n\nQuando usar:
\n- \n
- Parsing de números localizados (formato europeu "1.234,56"). \n
- Strings com espaços, moedas, porcentagens. \n
- Campos de entrada de UI, onde o usuário pode digitar qualquer coisa. \n
Mas lembre-se: NumberFormatter é pesado. Sua criação é cara, então sempre armazene em cache a instância como uma variável estática, em vez de criar uma nova para cada string.
3. Scanner (NSScanner) — antigo, mas rápido
\n\nA abordagem clássica do Objective-C — Scanner. Ele é mais rápido que o NumberFormatter, mas requer cuidado.
let scanner = Scanner(string: "123abc")\nvar intValue: Int = 0\nif scanner.scanInt(&intValue) {\n print("Encontrado: \\(intValue)") // 123\n}\n\nO Scanner varre a string da esquerda para a direita e para no primeiro caractere não numérico. Isso é útil se você precisa "extrair" um número de uma string com lixo.
\n\nDica de benchmark: Scanner é 3 a 5 vezes mais rápido que NumberFormatter, mas 2 a 3 vezes mais lento que o simples Int(). Ideal para parsing de dados mistos.
4. Função customizada: parsing manual para máxima velocidade
\n\nSe você está lendo este artigo no PythonLib, provavelmente sabe: quando a velocidade é essencial, escrevemos na mão. Para strings puramente numéricas (apenas dígitos 0-9, talvez um sinal de menos), podemos criar nosso próprio parser.
\n\nfunc fastInt(from string: String) -> Int? {\n var result = 0\n var isNegative = false\n var started