🔍 Por que verificar a existência de um elemento em um array Swift? E como fazer isso corretamente em 2025?
\n\nImagine: você está escrevendo um aplicativo para pedir pizza. O usuário selecionou "Pepperoni", "Havaiana" e "Margherita". Seu código deve garantir que "Pepperoni" já está no carrinho para não adicionar uma duplicata. Ou você está trabalhando com um banco de dados de clientes e verificando se o email está registrado no sistema. Verificar a existência de um elemento em um array é uma das operações mais comuns no desenvolvimento em Swift.
\n\nParece simples, não? Mas em 2025, quando o Swift evolui rapidamente e o desempenho de aplicativos móveis é crítico, escolher o método errado pode custar lentidão na interface do usuário ou horas extras de depuração. Neste artigo, vamos abordar todas as formas de verificar um elemento em um array Swift: desde o simples contains() até closures avançadas e trabalho com tipos personalizados. Você aprenderá qual método escolher para sua tarefa e por quê.
A propósito, esta é uma das perguntas mais populares no Stack Overflow (mais de 200.000 visualizações). E daremos uma resposta completa e moderna. Vamos lá! 🚀
\n\n📦 Arrays em Swift: visão geral básica (para quem tem pressa)
\n\nUm array (Array) é uma coleção ordenada de elementos do mesmo tipo. Em Swift, os arrays são type-safe, ou seja, você não pode adicionar acidentalmente uma string a um array de números. Isso é tanto uma vantagem (menos bugs) quanto um desafio (é necessário especificar os tipos rigorosamente).
let pizzaMenu: [String] = ["Margherita", "Pepperoni", "Havaiana", "Quatro Queijos"]\nlet numbers: [Int] = [1, 2, 3, 4, 5]\n\n\nAgora vamos ao principal — como verificar se um elemento existe em um array?
\n\n🛠️ Top 5 métodos para verificar a existência de um elemento em um array Swift
\n\n1. contains() — o rei da simplicidade (Equatable)
\n\nA maneira mais óbvia e frequentemente usada. O método contains(_:) retorna true se o elemento for encontrado. Funciona apenas com tipos que estão em conformidade com o protocolo Equatable (e todos os tipos básicos estão: String, Int, Double, etc.).
let pizzas = ["Margherita", "Pepperoni", "Havaiana"]\nif pizzas.contains("Pepperoni") {\n print("Tem essa pizza!") // ✅ Isso será exibido\n} else {\n print("Pizza não encontrada")\n}\n\n\nPrós: legível, conciso, rápido.
\nContras: não funciona se você tiver um objeto complexo (struct/class) sem Equatable.
2. contains(where:) — para verificações complexas
\n\nSe você precisa verificar não uma correspondência exata, mas uma condição (por exemplo, "existe uma pizza mais cara que 500 reais?"), use contains(where:). Ele aceita uma closure que retorna um Bool.
struct Pizza {\n let name: String\n let price: Int\n}\n\nlet order: [Pizza] = [\n Pizza(name: "Margherita", price: 450),\n Pizza(name: "Pepperoni", price: 550),\n Pizza(name: "Havaiana", price: 500)\n]\n\nlet hasExpensivePizza = order.contains { $0.price > 500 }\nprint("Tem pizza cara? \\(hasExpensivePizza)") // true\n\n\nPrós: flexibilidade, funciona com qualquer tipo.
\nContras: um pouco mais lento que contains() (mas para 99% dos casos a diferença é imperceptível).
3. firstIndex(of:) — quando o índice é importante
\n\nÀs vezes, você não precisa apenas saber se o elemento existe, mas também obter sua posição. Por exemplo, para removê-lo ou substituí-lo. O método firstIndex(of:) retorna um Int? opcional.
let pizzas = ["Margherita", "Pepperoni", "Havaiana"]\nif let index = pizzas.firstIndex(of: "Pepperoni") {\n print("Pepperoni está na posição \\(index)") // 1\n} else {\n print("Não encontrado")\n}\n\n\nImportante: firstIndex também requer Equatable. Se o seu tipo não estiver em conformidade