Convertendo URL para String e vice-versa

141

Então eu converti um NSURLpara um String. Então, se eu printlnparecer, file:///Users/...etc.

Mais tarde, eu quero isso de volta como um, NSURLentão eu tento convertê-lo novamente, como visto abaixo, mas perco duas das barras que aparecem na versão de string acima, que por sua vez quebra o código como urlinválido.

Por que minha conversão está de volta à NSURLremoção de duas barras do que Stringeu dou e como posso converter novamente nas NSURLtrês barras contendo?

var urlstring: String = recordingsDictionaryArray[selectedRow]["path"] as String
println("the url string = \(urlstring)")
// looks like file:///Users/........etc
var url = NSURL.fileURLWithPath(urlstring)
println("the url = \(url!)")
// looks like file:/Users/......etc
Gary Simpson
fonte
No Swift 5, converter string em url é Foundation.URL (string: "").
Kanishk Gupta

Respostas:

122

fileURLWithPath()é usado para converter um caminho de arquivo simples (por exemplo, "/ path / to / file") em um URL. Você urlStringé uma string de URL completa, incluindo o esquema, portanto, você deve usar

let url = NSURL(string: urlstring)

para convertê-lo novamente NSURL. Exemplo:

let urlstring = "file:///Users/Me/Desktop/Doc.txt"
let url = NSURL(string: urlstring)
println("the url = \(url!)")
// the url = file:///Users/Me/Desktop/Doc.txt
Martin R
fonte
9
Excelente. Ou agora em Swift:URL(string: urlstring)
Brent Faust
1
Talvez você precise de "urlstring.removingWhitespaces ()", porque URL (string não tem capacidade para funcionar quando a string possui espaços)
Carlos Parada
147

No Swift 4 e Swift 3 , para converter String em URL:

URL(string: String)

ou,

URL.init(string: "yourURLString")

E para converter o URL em String:

URL.absoluteString

O abaixo converte o 'conteúdo' do URL em string

String(contentsOf: URL)
Naishta
fonte
25
A segunda parte está incorreta. String(contentsOf: URL)retorna a carga útil real desse recurso, não o URL no formato de sequência. Use URL.absoluteStringpara obter a versão da string do URL. developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski,
4
Você está cometendo o mesmo erro que em stackoverflow.com/a/39967995/2227743 em que você converte a conversão do próprio URL em uma string com a conversão do conteúdo baixado em uma String. Você deve remover esta parte da sua resposta porque está completamente errada (ou fora de tópico, mas no final está errada porque não responde à pergunta).
Eric Aya
1
Mais de 35 pessoas acharam isso útil e votaram positivamente, eu prefiro mantê-lo como está.
Naishta 15/01/19
72

Existe uma maneira melhor de obter a versão em string do caminho do NSURL no Swift:

let path:String = url.path
iphaaw
fonte
5
mas ele retornará apenas /questions/27062454/converting-url-to-string-and-back-againpara o URL/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar 17/17
1
Isso é realmente realmente útil se você deseja usar o caminho para alguns dos outros métodos do FileManager que precisam de um caminho de string. Eles não gostam do file://formato.
Ben Baron
29

AVISO : preste atenção ao URL, é optionale pode ser nil. Você pode agrupar seu URL na cotação para convertê-lo em uma string. Você pode testá-lo no parquinho.
Atualização para o Swift 5, Xcode 11:

import Foundation

let urlString = "http://ifconfig.me"
// string to url
let url = URL(string: urlString)
//url to string
let string = "\(url)"
// if you want the path without `file` schema
// let string = "\(url.path)"
Roger
fonte
1
Note-se que isso também retorna o prefixo do esquema (pense file:///Users/foo). Embora apenas o caminho absoluto seja necessário (pense /Users/foo), ele url.pathdeve ser usado como na resposta do @ iphaaw abaixo.
Ahmed Khalaf
16
let url = URL(string: "URLSTRING HERE")
let anyvar =  String(describing: url)
Ahsan
fonte
14

Swift 3 (esqueça o NSURL).

let fileName = "20-01-2017 22:47"
let folderString = "file:///var/mobile/someLongPath"

Para transformar um URL em uma string:

let folder: URL? = Foundation.URL(string: folderString)
// Optional<URL>
//  ▿ some : file:///var/mobile/someLongPath

Se queremos adicionar o nome do arquivo. Observe que appendingPathComponent () adiciona a porcentagem de codificação automaticamente:

let folderWithFilename: URL? = folder?.appendingPathComponent(fileName)
// Optional<URL>
//  ▿ some : file:///var/mobile/someLongPath/20-01-2017%2022:47

Quando queremos ter String, mas sem a parte raiz (preste atenção que a porcentagem de codificação é removida automaticamente):

let folderWithFilename: String? = folderWithFilename.path
// ▿ Optional<String>
//  - some : "/var/mobile/someLongPath/20-01-2017 22:47"

Se queremos manter a parte raiz, fazemos isso (mas lembre-se da porcentagem de codificação - ela não é removida):

let folderWithFilenameAbsoluteString: String? = folderWithFilenameURL.absoluteString
// ▿ Optional<String>
//  - some : "file:///var/mobile/someLongPath/20-01-2017%2022:47"

Para adicionar manualmente a porcentagem de codificação para uma sequência:

let folderWithFilenameAndEncoding: String? = folderWithFilename.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
// ▿ Optional<String>
//  - some : "/var/mobile/someLongPath/20-01-2017%2022:47"

Para remover a porcentagem de codificação:

let folderWithFilenameAbsoluteStringNoEncodig: String? = folderWithFilenameAbsoluteString.removingPercentEncoding
// ▿ Optional<String>
//  - some : "file:///var/mobile/someLongPath/20-01-2017 22:47"

A codificação percentual é importante porque os URLs para solicitações de rede precisam deles, enquanto os URLs para o sistema de arquivos nem sempre funcionam - depende do método real que os utiliza. A ressalva aqui é que elas podem ser removidas ou adicionadas automaticamente, portanto é melhor depurar essas conversões com cuidado.

Vitalii
fonte
9

Código da versão do Swift 3:

let urlString = "file:///Users/Documents/Book/Note.txt"
let pathURL = URL(string: urlString)!
print("the url = " + pathURL.path)
mriaz0011
fonte
4

2020 SWIFT 5.1:

let url = URL(fileURLWithPath: "//Users/Me/Desktop/Doc.txt")

let a = String(describing: url)       // "file:////Users/Me/Desktop/Doc.txt"
let b = "\(url)"                      // "file:////Users/Me/Desktop/Doc.txt"
let c = url.absoluteString            // "file:////Users/Me/Desktop/Doc.txt"
let d = url.path                      // "/Users/Me/Desktop/Doc.txt" 
// BUT value of `d` will be invisible due to debug process, so...
let e = "\(url.path)"                 // "/Users/Me/Desktop/Doc.txt"

E extensão para URL?

extension Optional where Wrapped == URL {
    func toString() -> String {
        guard let val = self else { return "" }

        return "\(val.path)"
    }
}

 uso:

let str = optionalUrl.toString() // "/Users/Me/Desktop/Doc.txt"
    str = emptyOptionalUrl.toString() // ""
Andrew
fonte
1

O Swift 3 usado com o UIWebViewDelegate shouldStartLoadWith

  func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    let urlPath: String = (request.url?.absoluteString)!
    print(urlPath)
    if urlPath.characters.last == "#" {
        return false
    }else{
        return true
    }

}
Raj Joshi
fonte