«¿Y dónde está mi .trim()?» — o por qué Swift no es Python
\n\nSi vienes a Swift desde Python o JavaScript, seguramente estás acostumbrado a la simple llamada " hola ".trim() o " hola ".strip(). Y entonces escribes tu primer código en Swift, intentas hacer lo mismo y obtienes un error de compilación. ¿Te suena familiar?
En Stack Overflow esta pregunta ha recibido miles de visitas, y con razón. En Swift no existe el método .trim() para String. Pero esto no significa que no se puedan recortar espacios y caracteres. Simplemente el enfoque es diferente, más al estilo Swift. Vamos a aclararlo de una vez por todas.
En este artículo no solo responderemos a la pregunta principal, sino que también mostraremos ejemplos de código reales que podrás insertar directamente en tu proyecto. ¡Allá vamos!
\n\nRespuesta breve: sí, pero no como estás acostumbrado
\n\nEn Swift no existe un único método .trim(). En su lugar, se utiliza una familia de métodos del protocolo Foundation:
- \n
trimmingCharacters(in:)— la herramienta principal \n .trimmingCharacters(in: .whitespacesAndNewlines)— la opción más popular \n
¿Suena escueto? En la práctica, esto ofrece flexibilidad: tú decides qué caracteres exactos quieres recortar, sin depender de la «magia» de un método incorporado.
\n\nCómo funciona trimmingCharacters — análisis con ejemplos
\n\nEjemplo básico: eliminar espacios y saltos de línea
\n\nimport Foundation\n\nlet text = " ¡Hola, Swift! \\n"\nlet trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines)\nprint(trimmed) // "¡Hola, Swift!"\n\nObserva que debemos importar Foundation. Sin esto, el método no está disponible, ya que está definido en NSString, que se «mezcla» con el String de Swift a través de un puente.
Solo espacios (sin eliminar saltos de línea)
\n\nlet textWithNewline = " Hola\\n"\nlet onlySpacesTrimmed = textWithNewline.trimmingCharacters(in: .whitespaces)\nprint(onlySpacesTrimmed) // "Hola\\n"\n\n¿Ves? El salto de línea se mantiene. Esto es útil cuando quieres conservar el formato pero eliminar los espacios sobrantes en los bordes.
\n\nRecorte de caracteres arbitrarios
\n\nEn CharacterSet se puede pasar cualquier conjunto:
let email = " usuario@ejemplo.com "\nlet cleaned = email.trimmingCharacters(in: .whitespaces)\nprint(cleaned) // "usuario@ejemplo.com"\n\nlet price = "$99.99"\nlet noDollar = price.trimmingCharacters(in: CharacterSet(charactersIn: "$"))\nprint(noDollar) // "99.99"\n\n¿Y qué hay de trimLeft / trimRight (ltrim / rtrim)?
\n\nEn Python existen .lstrip() y .rstrip(). En Swift, no. Pero esto se puede implementar fácilmente de forma manual. Aquí tienes dos extensiones simples que puedes añadir a tu proyecto:
import Foundation\n\nextension String {\n func trimmingLeft(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {\n var start = startIndex\n while start < endIndex, characterSet.contains(self[start].unicodeScalars.first!) {\n formIndex(after: &start)\n }\n return String(self[start..<endIndex])\n }\n \n func trimmingRight(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {\n var end = endIndex\n while end > startIndex, characterSet.contains(self[index(before: end)].unicodeScalars.first!) {\n formIndex(before: &end)\n }\n return String(self[startIndex..<end])\n }\n}\n\n// Ejemplo de uso:\nlet text = " Hola Mundo "\nprint(text.trimmingLeft()) // "Hola Mundo "\nprint(text.trimmingRight()) // " Hola Mundo"\n\nAhora tienes trimLeft y trimRight completos, como en tu querido Python. Guarda este código en un archivo aparte, te será útil.