Introdução ao problema: por que NSURL e NSString são tão importantes?
\n\nTodo desenvolvedor iOS, mais cedo ou mais tarde, enfrenta a tarefa: você tem um objeto NSURL, mas precisa obter dele uma string comum — NSString (ou, no Swift moderno, simplesmente String). Parece simples, não? No entanto, existem várias armadilhas: desde a decodificação incorreta de caracteres até a perda de fragmentos da URL.
No Stack Overflow, a pergunta "Convert an NSURL to an NSString" acumulou milhares de visualizações — é um verdadeiro clássico. Nós, da PythonLib, decidimos abordar o tópico a fundo para que você nunca mais perca tempo procurando soluções. Vamos lá!
\n\nO que são NSURL e NSString em Swift?
\n\nAntes de ir para o código, vamos lembrar rapidamente com o que estamos lidando.
\n\nNSURL é um objeto que representa um Localizador Uniforme de Recursos (URL). Ele é capaz de dividir endereços em componentes: esquema, host, caminho, parâmetros e assim por diante. Em Swift, ele foi substituído pelo tipo nativo URL, mas NSURL ainda é amplamente usado em código legado, Core Foundation e ao trabalhar com bibliotecas Objective-C.
NSString é uma string em Objective-C que, em Swift, é automaticamente convertida (bridged) para o tipo String. Portanto, quando dizemos "converter NSURL em NSString", na verdade obtemos um String ou NSString?.
Principais formas de converter NSURL em NSString
\n\nVamos analisar três abordagens principais. Cada uma é adequada para cenários diferentes.
\n\n1. Usando a propriedade absoluteString
\n\nA maneira mais popular e simples. A propriedade absoluteString retorna a string completa da URL, incluindo todos os 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 retorna uma string que pode conter codificação percentual (percent-encoding). Por exemplo, espaços aparecerão como %20, e caracteres cirílicos como %D0%9F.
2. Propriedade relativeString
\n\nSe sua URL for relativa (não contém esquema e host), relativeString retornará apenas a 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 é especialmente útil quando você trabalha com URLs base e caminhos relativos.
\n\n3. Analisando manualmente os componentes da URL
\n\nÀs vezes, você não precisa da URL completa, mas apenas de uma parte: caminho, host ou parâmetros. Para isso, use as propriedades de NSURLComponents ou acesse diretamente 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("Caminho: \\(path)")\nprint("Parâmetros: \\(query)")\nprint("Âncora: \\(fragment)")\n\nEsta abordagem oferece controle máximo sobre o que você está extraindo.
\n\nErros comuns e como evitá-los
\n\nAté desenvolvedores experientes às vezes tropeçam em coisas simples. Aqui estão três problemas mais frequentes ao converter NSURL para NSString.
Erro 1: Esquecer a opcionalidade
\n\nNSURL(string:) retorna um tipo opcional NSURL?. Se a string