Swift: ¿Cómo reemplazar caracteres en una cadena? Análisis completo para principiantes
\n\nTarde o temprano, todo desarrollador de Swift se enfrenta a la tarea: necesita reemplazar unos caracteres en una cadena por otros. Parecería que podría ser más simple? Pero los principiantes a menudo se pierden porque Swift String no es un arreglo de caracteres como en C, sino una estructura compleja compatible con Unicode. En este artículo, analizaremos las formas más populares y efectivas de reemplazar caracteres en Swift, desde las simples hasta las avanzadas.
\n\nNo enumeraremos los métodos de forma seca. En su lugar, analizaremos ejemplos reales que encontrará en la práctica: desde reemplazar espacios hasta eliminar signos de puntuación y trabajar con emojis. ¡Allá vamos!
\n\n¿Por qué Swift String no es simplemente un arreglo de caracteres?
\nAntes de reemplazar caracteres, es importante entender cómo está estructurada una cadena en Swift. String es una colección de Character, pero cada Character puede constar de múltiples escalares Unicode (por ejemplo, el emoji 🚀 o la letra «é» con diacríticos). Por lo tanto, la indexación por Int no funciona directamente aquí. En su lugar, Swift usa String.Index.
Pero para reemplazar caracteres, no necesita sumergirse en las profundidades de los índices; existen métodos de alto nivel listos para usar. Veamos los más populares.
\n\nMétodo n.º 1: replacingOccurrences — el rey del reemplazo
\nLa forma más simple y obvia es usar el método replacingOccurrences(of:with:). Devuelve una nueva cadena con las ocurrencias reemplazadas. La cadena original permanece sin cambios (Swift es un lenguaje con cadenas inmutables por defecto).
let original = "Hello, World!"\nlet replaced = original.replacingOccurrences(of: "World", with: "Swift")\nprint(replaced) // "Hello, Swift!"\nprint(original) // "Hello, World!" — el original no cambió\n\nEste método es ideal para casos simples: reemplazar una palabra, carácter o subcadena. Pero, ¿qué hacer si necesita reemplazar varios caracteres diferentes? Por ejemplo, ¿eliminar todos los espacios y puntos?
\n\nCadena de llamadas para reemplazos múltiples
\nPuede llamar a replacingOccurrences varias veces seguidas:
let text = "Hello, World! How are you?"\nlet cleaned = text\n .replacingOccurrences(of: ",", with: "")\n .replacingOccurrences(of: "!", with: "")\n .replacingOccurrences(of: " ", with: "_")\nprint(cleaned) // "Hello_World_How_are_you?"\n\nInconveniente: si hay muchos reemplazos, el código se vuelve voluminoso. Para estos casos, son mejores otros métodos o expresiones regulares.
\n\nMétodo n.º 2: Reemplazo con map y filter (enfoque funcional)
\nSwift no es solo POO, sino también programación funcional. Puede recorrer cada carácter de la cadena con map y reemplazarlos según una condición. Esto es especialmente útil cuando necesita reemplazar todas las ocurrencias de un conjunto específico de caracteres.
let input = "a1b2c3d4"\nlet result = input.map { char -> Character in\n if char.isNumber {\n return "X"\n } else {\n return char\n }\n}\nprint(String(result)) // "aXbXcXdX"\n\nAquí reemplazamos todos los dígitos por "X". ¿Y si necesita eliminar caracteres? Use filter:
let withPunctuation = "Hello!!! How are you??"\nlet noPunctuation = withPunctuation.filter { !$0.isPunctuation }\nprint(noPunctuation) // "Hello How are you"\n\nEste enfoque es muy flexible: puede usar cualquier verificación — isNumber, isLetter, isWhitespace o incluso la comparación con un conjunto de caracteres.
Método n.º 3: Expresiones regulares (NSRegularExpression)
\nCuando la tarea se complica (reemplazo por patrón, eliminación de todos los correos electrónicos, reemplazo de fechas), no se puede prescindir de las expresiones regulares. Swift admite NSRegularExpression de Foundation.
\n\nimport Foundation\n\nlet text = "My email is test@example.com and your is user@test.org"\nlet regex = try! NSRegularExpression