Convertir NSURL a NSString en Swift: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción al problema: ¿por qué NSURL y NSString son tan importantes?

\n\n

Todo 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.

\n\n

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\n

Antes de pasar al código, recordemos rápidamente con qué estamos tratando.

\n\n

NSURL 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.

\n\n

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?.

\n\n

Métodos principales para convertir NSURL a NSString

\n\n

Analicemos tres enfoques principales. Cada uno es adecuado para diferentes escenarios.

\n\n

1. Uso de la propiedad absoluteString

\n\n

La forma más popular y sencilla. La propiedad absoluteString devuelve la cadena completa de la URL, incluyendo todos los componentes.

\n\n
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\n

Importante: 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.

\n\n

2. Propiedad relativeString

\n\n

Si su URL es relativa (no contiene esquema ni host), relativeString devolverá solo la parte relativa.

\n\n
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\n

Este método es especialmente útil cuando se trabaja con URL base y rutas relativas.

\n\n

3. Descomposición manual de los componentes de la URL

\n\n

A 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.

\n\n
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\n

Este enfoque brinda el máximo control sobre lo que extrae exactamente.

\n\n

Errores típicos y cómo evitarlos

\n\n

Incluso los desarrolladores experimentados a veces tropiezan con cosas simples. Aquí están los tres problemas más comunes al convertir NSURL a NSString.

\n\n

Error 1: Olvidar la opcionalidad

\n\n

NSURL(string:) devuelve un tipo opcional NSURL?. Si la cadena

Blogs

Book Recommendations