Como verificar se uma string contém substring em Swift? Guia completo
\n\nOlá, colega desenvolvedor! Se você já programou em Swift e se perguntou: "Como faço para encontrar uma palavra dentro de outra?", você está no lugar certo. Este é um dos tópicos mais populares no Stack Overflow (a versão em inglês já acumulou centenas de milhares de visualizações). E não é por acaso: trabalhar com strings é fundamental para qualquer aplicativo.
\n\nNeste artigo, vamos explorar todas as formas legítimas de verificar se uma string contém uma substring. Desde o simples contains() até técnicas avançadas com busca case-insensitive e expressões regulares. Vamos nessa!
1. A maneira mais simples: o método contains()
\n\nDesde o Swift 1.0, temos o método nativo contains() no tipo String. Ele funciona de forma intuitiva e é muito rápido.
let fullString = "Olá, mundo Swift!"\nlet searchString = "Swift"\n\nif fullString.contains(searchString) {\n print("Sim, a string contém '\\(searchString)'")\n} else {\n print("Não, não contém")\n}\n// Saída: Sim, a string contém 'Swift'\n\nImportante: o método contains() diferencia maiúsculas de minúsculas. Ou seja, "swift" não será encontrado na string "Swift". Mas vamos corrigir isso mais adiante.
2. Busca case-insensitive: localizedCaseInsensitiveContains()
\n\nMuitas vezes, precisamos encontrar uma palavra ignorando letras maiúsculas e minúsculas. Para isso, existe um método especial que considera a localidade do usuário.
\n\nlet text = "Bem-vindo ao Swift"\nlet search = "swift"\n\nif text.localizedCaseInsensitiveContains(search) {\n print("Encontrado! Maiúsculas/minúsculas não são problema.")\n} else {\n print("Não encontrado")\n}\n// Saída: Encontrado! Maiúsculas/minúsculas não são problema.\n\nEste método usa a localidade atual do dispositivo, o que é especialmente importante para idiomas com regras de comparação especiais (como o turco, onde "i" e "I" são letras diferentes).
\n\n3. Busca com localidade: localizedStandardContains()
\n\nOutro método útil é o localizedStandardContains(). Ele realiza a busca da mesma forma que a pesquisa padrão do iOS (como no Spotlight ou Finder).
let fileName = "Fotos_ferias_2024.jpg"\nlet query = "ferias"\n\nif fileName.localizedStandardContains(query) {\n print("Arquivo encontrado!")\n}\n// Saída: Arquivo encontrado!\n\nEste método normaliza automaticamente as strings, remove sinais diacríticos (por exemplo, "é" = "e") e ignora maiúsculas/minúsculas. Ideal para campos de busca em interfaces.
\n\n4. O método clássico: range(of:)
\n\nÀs vezes, não basta saber se a substring existe; precisamos também da sua posição. É aí que entra o range(of:). Ele retorna um intervalo opcional (Range<String.Index>?).
let phrase = "Estudando Swift no pythonlib.ru"\nlet word = "Swift"\n\nif let range = phrase.range(of: word) {\n print("Substring encontrada na posição: \\(range.lowerBound)")\n // Podemos até extrair um trecho da string\n let extracted = phrase[range]\n print("Extraído: \\(extracted)")\n} else {\n print("Substring não encontrada")\n}\n\nPara busca case-insensitive com range, use a opção .caseInsensitive:
if let range = phrase.range(of: "swift", options: .caseInsensitive) {\n print("Encontrado sem diferenciar maiúsculas: \\(phrase[range])")\n}\n\n5. Verificando início e fim da string
\n\nÀs vezes, precisamos verificar não "se contém", mas "se começa com..." ou "se termina com...". Para isso, existem métodos específicos:
\n\nlet url = "https://pythonlib.ru"\n\nif url.hasPrefix("https://") {\n print("Esta é uma URL segura")\n}\n\nif url.hasSuffix(".ru") {\n print("Domínio russo")\n}\n\nAmbos os métodos também diferenciam maiúsculas de minúsculas.