Introducción: Por qué "Encontrar el índice" es una base que debes saber de memoria
\n\nImagina: estás escribiendo una aplicación para iOS. Tienes un array de tareas y el usuario quiere eliminar una tarea específica por su nombre. O quizás estás buscando la posición de un elemento para actualizarlo en la lista. En ambos casos necesitas lo mismo: encontrar el índice de un elemento en un array Swift. Esta tarea es tan popular que la pregunta en Stack Overflow ha acumulado miles de visitas. Y no es casualidad: la búsqueda de índices es uno de los escenarios más comunes en el desarrollo diario.
\n\nEn este tutorial, analizaremos todas las formas de encontrar el índice de un elemento en Swift: desde el simple firstIndex(of:) hasta la búsqueda avanzada con closures. Aprenderás a trabajar con arrays de cadenas, números y objetos personalizados. ¡Vamos allá!
1. Preparación: ¿Qué es un índice en un array Swift?
\n\nAntes de saltar al código, recordemos los conceptos básicos. Un array en Swift es una colección ordenada de elementos. Cada elemento tiene su índice: un número entero que comienza en 0. El primer elemento es el índice 0, el segundo es el 1, y así sucesivamente.
\n\nlet fruits = ["🍎 Manzana", "🍌 Banana", "🍒 Cereza"]\n// Índices: 0 1 2\n\n\nCuando decimos "encontrar el índice de un elemento", nos referimos a: "Devuélveme el número de la posición en la que se encuentra este elemento". En Swift, existen varios métodos elegantes para esto. Analicémoslos en orden.
\n\n2. La forma clásica: firstIndex(of:) — el camino más simple
\n\nA partir de Swift 4.2, el método firstIndex(of:) se convirtió en la forma estándar de buscar el índice de un elemento. Devuelve un valor opcional Int?: si se encuentra el elemento, obtienes el índice; si no, obtienes nil.
Ejemplo con un array de cadenas
\n\nlet fruits = ["Manzana", "Banana", "Cereza", "Dátil"]\n\nif let index = fruits.firstIndex(of: "Cereza") {\n print("Índice de 'Cereza': \\(index)") // Mostrará: 2\n} else {\n print("Elemento no encontrado")\n}\n\n\nTen en cuenta: firstIndex(of:) busca la primera aparición. Si hay duplicados en el array, solo devolverá el primer índice.
Ejemplo con un array de números
\n\nlet numbers = [10, 20, 30, 40, 50]\n\nif let position = numbers.firstIndex(of: 30) {\n print("El número 30 está en la posición \\(position)") // 2\n}\n\n\nImportante: Este método solo funciona con tipos que cumplen con el protocolo Equatable. Todos los tipos estándar (Int, String, Double, Bool) ya lo cumplen.
3. Búsqueda por condición: firstIndex(where:) — flexibilidad sin límites
\n\n¿Y si necesitas encontrar el índice no por un valor exacto, sino por una condición? Por ejemplo, encontrar el primer elemento mayor que 25, o una cadena que comience con una letra específica. Para esto existe el método firstIndex(where:) (anteriormente index(where:)).
Sintaxis con closure
\n\nlet scores = [15, 22, 37, 41, 19]\n\nif let index = scores.firstIndex(where: { $0 > 25 }) {\n print("El primer elemento mayor que 25 está en el índice \\(index)") // 2 (valor 37)\n}\n\n\nBúsqueda por propiedad de un objeto
\n\nSupongamos que tienes un array de estructuras 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: "Boris", age: 30),\n User(name: "Víctor", age: 22)\n]\n\n// Encontremos el índice del usuario con el nombre "Boris"\nif let index = users.firstIndex(where: { $0.name == "Boris" }) {\n print("Boris está en el índice \\(index)") // 1\n}\n\n\nEste enfoque es increíblemente potente. Puedes usar cualquier condición lógica: verificar múltiples propiedades, usar expresiones regulares o incluso llamar a funciones dentro del closure.
\n\n4. Trabajar con duplicados: cómo encontrar todos los índices
\n\nM