String para Int em Swift: 5 métodos com benchmarks e otimização

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

String para Int em Swift: do básico ao performático

\n\n

Todo 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.

\n\n

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\n

O conteúdo é baseado em uma pergunta popular do Stack Overflow (milhares de visualizações) e adaptado para o portal educacional PythonLib. Vamos nessa!

\n\n

1. Método básico: Int(string)

\n\n

A 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.

\n\n
let stringNumber = "123"\nif let number = Int(stringNumber) {\n    print("Número: \\(number)")\n} else {\n    print("Falha ao converter")\n}
\n\n

Vantagens:

\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
\n\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
\n\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\n

2. Usando NumberFormatter: para strings "sujas"

\n\n

O 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.

\n\n
let formatter = NumberFormatter()\nformatter.numberStyle = .decimal\n\nif let number = formatter.number(from: " 1 234 ")?.intValue {\n    print(number) // 1234\n}
\n\n

Quando 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
\n\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.

\n\n

3. Scanner (NSScanner) — antigo, mas rápido

\n\n

A abordagem clássica do Objective-C — Scanner. Ele é mais rápido que o NumberFormatter, mas requer cuidado.

\n\n
let scanner = Scanner(string: "123abc")\nvar intValue: Int = 0\nif scanner.scanInt(&intValue) {\n    print("Encontrado: \\(intValue)") // 123\n}
\n\n

O 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\n

Dica 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.

\n\n

4. Função customizada: parsing manual para máxima velocidade

\n\n

Se 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\n
func fastInt(from string: String) -> Int? {\n    var result = 0\n    var isNegative = false\n    var started                

Blogs

Book Recommendations