Introducción al problema: ¿por qué NSURL y NSString son tan importantes?
\n\nTodo desarrollador iOS, tarde o temprano, se enfrenta a la tarea: tienes un objeto NSURL, pero necesitas obtener una cadena normal a partir de él — NSString (o, en Swift moderno, simplemente String). Parecería que podría ser más simple. Sin embargo, aquí se esconden muchos escollos: desde la decodificación incorrecta de caracteres hasta la pérdida de fragmentos de la URL.
En Stack Overflow, la pregunta «Convert an NSURL to an NSString» ha acumulado miles de visitas: es todo un clásico. En PythonLib decidimos analizar el tema a fondo para que nunca más pierda tiempo buscando una solución. ¡Allá vamos!
\n\n¿Qué son NSURL y NSString en Swift?
\n\nAntes de pasar al código, recordemos rápidamente con qué estamos tratando.
\n\nNSURL es un objeto que representa un localizador uniforme de recursos (URL). Puede descomponer direcciones en componentes: esquema, host, ruta, parámetros, etc. En Swift, fue reemplazado por el tipo nativo URL, pero NSURL todavía se usa activamente en código antiguo, Core Foundation y al trabajar con bibliotecas de Objective-C.
NSString es una cadena en Objective-C que en Swift se puentea (bridges) automáticamente al tipo String. Por lo tanto, cuando decimos «convertir NSURL a NSString», en realidad obtenemos un String o un NSString?.
Métodos principales para convertir NSURL a NSString
\n\nAnalicemos tres enfoques principales. Cada uno es adecuado para diferentes escenarios.
\n\n1. Uso de la propiedad absoluteString
\n\nLa forma más popular y sencilla. La propiedad absoluteString devuelve la cadena completa de la URL, incluyendo todos los componentes.
import Foundation\n\nlet url = NSURL(string: "https://pythonlib.ru/swift-guide?page=1&lang=ru")!\nlet urlString = url.absoluteString\n\nprint(urlString) // "https://pythonlib.ru/swift-guide?page=1&lang=ru"\n\nImportante: absoluteString devuelve una cadena que puede contener codificación porcentual (percent-encoding). Por ejemplo, los espacios se verán como %20 y el cirílico como %D0%9F.
2. Propiedad relativeString
\n\nSi su URL es relativa (no contiene esquema ni host), relativeString devolverá solo la parte relativa.
let baseURL = NSURL(string: "https://pythonlib.ru")!\nlet relativeURL = NSURL(string: "swift-guide", relativeTo: baseURL)!\n\nlet absolute = relativeURL.absoluteString\nlet relative = relativeURL.relativeString\n\nprint(absolute) // "https://pythonlib.ru/swift-guide"\nprint(relative) // "/swift-guide"\n\nEste método es especialmente útil cuando se trabaja con URL base y rutas relativas.
\n\n3. Descomposición manual de los componentes de la URL
\n\nA veces no necesita la URL completa, sino solo una parte: la ruta, el host o los parámetros. Para esto, use las propiedades de NSURLComponents o acceda directamente a NSURL.
let url = NSURL(string: "https://pythonlib.ru/ios/guide?query=swift#section1")!\n\nlet scheme = url.scheme ?? ""\nlet host = url.host ?? ""\nlet path = url.path ?? ""\nlet query = url.query ?? ""\nlet fragment = url.fragment ?? ""\n\nprint("Esquema: \\(scheme)")\nprint("Host: \\(host)")\nprint("Ruta: \\(path)")\nprint("Parámetros: \\(query)")\nprint("Ancla: \\(fragment)")\n\nEste enfoque brinda el máximo control sobre lo que extrae exactamente.
\n\nErrores típicos y cómo evitarlos
\n\nIncluso los desarrolladores experimentados a veces tropiezan con cosas simples. Aquí están los tres problemas más comunes al convertir NSURL a NSString.
Error 1: Olvidar la opcionalidad
\n\nNSURL(string:) devuelve un tipo opcional NSURL?. Si la cadena