Introdução: Por que "Encontrar o índice" é a base que você precisa saber de cor
\n\nImagine: você está escrevendo um aplicativo para iOS. Você tem um array de tarefas e o usuário quer excluir uma tarefa específica pelo nome. Ou, talvez, você esteja procurando a posição de um elemento para atualizá-lo na lista. Em ambos os casos, você precisa da mesma coisa — encontrar o índice de um elemento em um array Swift. Esta tarefa é tão popular que a pergunta no Stack Overflow acumulou milhares de visualizações. E não é por acaso: a busca por índice é um dos cenários mais comuns no desenvolvimento do dia a dia.
\n\nNeste tutorial, vamos abordar todas as maneiras de encontrar o índice de um elemento em Swift: desde o simples firstIndex(of:) até a busca avançada com closures. Você aprenderá a trabalhar com arrays de strings, números e objetos personalizados. Vamos lá!
1. Preparação: O que é um índice em um array Swift?
\n\nAntes de pular para o código, vamos relembrar o básico. Um array em Swift é uma coleção ordenada de elementos. Cada elemento tem seu índice — um número inteiro, começando em 0. O primeiro elemento é o índice 0, o segundo é 1 e assim por diante.
\n\nlet fruits = ["🍎 Maçã", "🍌 Banana", "🍒 Cereja"]\n// Índices: 0 1 2\n\n\nQuando dizemos "encontrar o índice de um elemento", queremos dizer: "Retorne-me o número da posição em que este elemento está". Em Swift, existem vários métodos elegantes para isso. Vamos abordá-los em ordem.
\n\n2. A maneira clássica: firstIndex(of:) — o caminho mais simples
\n\nA partir do Swift 4.2, o método firstIndex(of:) tornou-se a maneira padrão de buscar o índice de um elemento. Ele retorna um valor opcional Int? — se o elemento for encontrado, você obtém o índice; se não, nil.
Exemplo com array de strings
\n\nlet fruits = ["Maçã", "Banana", "Cereja", "Tâmara"]\n\nif let index = fruits.firstIndex(of: "Cereja") {\n print("Índice de 'Cereja': \\(index)") // Exibirá: 2\n} else {\n print("Elemento não encontrado")\n}\n\n\nObserve: firstIndex(of:) busca a primeira ocorrência. Se houver duplicatas no array, ele retornará apenas o primeiro índice.
Exemplo com array de números
\n\nlet numbers = [10, 20, 30, 40, 50]\n\nif let position = numbers.firstIndex(of: 30) {\n print("O número 30 está na posição \\(position)") // 2\n}\n\n\nImportante: Este método funciona apenas com tipos que estão em conformidade com o protocolo Equatable. Todos os tipos padrão (Int, String, Double, Bool) já estão em conformidade.
3. Busca por condição: firstIndex(where:) — flexibilidade sem limites
\n\nE se você precisar encontrar o índice não por um valor exato, mas por uma condição? Por exemplo, encontrar o primeiro elemento maior que 25, ou uma string que começa com uma determinada letra. Para isso, existe o método firstIndex(where:) (anteriormente index(where:)).
Sintaxe com closure
\n\nlet scores = [15, 22, 37, 41, 19]\n\nif let index = scores.firstIndex(where: { $0 > 25 }) {\n print("O primeiro elemento maior que 25 está no índice \\(index)") // 2 (valor 37)\n}\n\n\nBusca por propriedade de objeto
\n\nSuponha que você tenha um array de estruturas personalizadas:
\n\nstruct User {\n let name: String\n let age: Int\n}\n\nlet users = [\n User(name: "Ana", age: 25),\n User(name: "Bruno", age: 30),\n User(name: "Carlos", age: 22)\n]\n\n// Vamos encontrar o índice do usuário com o nome "Bruno"\nif let index = users.firstIndex(where: { $0.name == "Bruno" }) {\n print("Bruno está no índice \\(index)") // 1\n}\n\n\nEsta abordagem é incrivelmente poderosa. Você pode usar qualquer condição booleana: verificar várias propriedades, usar expressões regulares ou até mesmo chamar funções dentro do closure.
\n\n4. Trabalhando com duplicatas: como encontrar todos os índices
\n\nM