String a Int en Swift: de lo simple a lo eficiente
\n\nTodo desarrollador iOS, tarde o temprano, se enfrenta a una tarea aparentemente simple: convertir una cadena en un número. Parecería que no hay nada más fácil — Int("42") y listo. Pero cuando la aplicación procesa miles de cadenas, analiza registros JSON o lee entrada del usuario, el rendimiento de esta operación se vuelve crítico.
En este artículo no solo mostraremos cómo convertir String a Int en Swift, sino que también realizaremos una verdadera investigación: ¿qué método es más rápido?, ¿qué trampas se esconden detrás de un código simple? y cómo escribir código optimizado en Swift que no falle en producción.
\n\nEl material está basado en una pregunta popular de Stack Overflow (miles de visitas) y adaptado para el portal educativo PythonLib. ¡Allá vamos!
\n\n1. Método básico: Int(string)
\n\nLa forma más obvia y recomendada por Apple es usar el inicializador Int(String). Devuelve un valor opcional Int?, lo cual es seguro: si la cadena no es un número, obtendrá nil.
let stringNumber = "123"\nif let number = Int(stringNumber) {\n print("Número: \\(number)")\n} else {\n print("No se pudo convertir")\n}\n\nVentajas:
\n- \n
- Legibilidad del código — la mejor de todas las opciones. \n
- Seguridad — el opcional protege contra fallos. \n
- Soporte para diferentes bases numéricas:
Int("FF", radix: 16). \n
Desventajas:
\n- \n
- Rendimiento — en operaciones masivas puede ser un cuello de botella. \n
- No maneja espacios, signos de moneda ni números localizados. \n
Este método es ideal para el 90% de los casos. Pero si está escribiendo un analizador de registros o procesando archivos CSV con un millón de líneas, siga leyendo.
\n\n2. Uso de NumberFormatter: para cadenas «sucias»
\n\nEl mundo real no es perfecto. El usuario puede ingresar " 42 ", "$100" o "1 234.56". Aquí es donde NumberFormatter viene al rescate: una herramienta potente pero lenta.
let formatter = NumberFormatter()\nformatter.numberStyle = .decimal\n\nif let number = formatter.number(from: " 1 234 ")?.intValue {\n print(number) // 1234\n}\n\nCuándo usarlo:
\n- \n
- Análisis de números localizados (formato europeo "1.234,56"). \n
- Cadenas con espacios, monedas, porcentajes. \n
- Campos de entrada de UI, donde el usuario puede ingresar cualquier cosa. \n
Sin embargo, recuerde: NumberFormatter es pesado. Su creación es costosa, por lo tanto, siempre almacene en caché la instancia como una variable estática, en lugar de crearla de nuevo para cada cadena.
3. Scanner (NSScanner) — antiguo pero rápido
\n\nEl enfoque clásico de Objective-C — Scanner. Funciona más rápido que NumberFormatter, pero requiere cuidado.
let scanner = Scanner(string: "123abc")\nvar intValue: Int = 0\nif scanner.scanInt(&intValue) {\n print("Encontrado: \\(intValue)") // 123\n}\n\nScanner escanea la cadena de izquierda a derecha y se detiene en el primer carácter no numérico. Esto es útil si necesita «extraer» un número de una cadena con basura.
\n\nConsejo de benchmark: Scanner es de 3 a 5 veces más rápido que NumberFormatter, pero de 2 a 3 veces más lento que el simple Int(). Ideal para analizar datos mixtos.
4. Función personalizada: análisis manual para máxima velocidad
\n\nSi está leyendo este artículo en PythonLib, seguramente sabe: cuando se necesita velocidad, se escribe a mano. Para cadenas numéricas limpias (solo caracteres 0-9, posiblemente un signo menos), se puede escribir su propio analizador.
\n\nfunc fastInt(from string: String) -> Int? {\n var result = 0\n var isNegative = false\n var started