Conversione dell'URL in String e viceversa


141

Quindi ho convertito un NSURLin un String. Quindi se io printlnsembra file:///Users/...ecc.

Più tardi lo voglio indietro e NSURLquindi provo a riconvertirlo come visto di seguito, ma perdo due delle barre che appaiono nella versione di stringa sopra, che a sua volta rompe il codice perché urlnon è valido.

Perché la mia conversione torna alla NSURLrimozione di due barre in avanti dal Stringmio indirizzo e come posso riconvertire le NSURLtre barre in avanti contenenti?

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

In Swift 5, per convertire la stringa in url è Foundation.URL (stringa: "").
Kanishk Gupta,

Risposte:


122

fileURLWithPath()viene utilizzato per convertire un percorso di file semplice (ad esempio "/ percorso / in / file") in un URL. La tua urlStringè una stringa URL completa incluso lo schema, quindi dovresti usare

let url = NSURL(string: urlstring)

per riconvertirlo in NSURL. Esempio:

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

9
Eccellente. O ora in Swift:URL(string: urlstring)
Brent Faust,

1
Forse hai bisogno di "urlstring.removingWhitespaces ()", perché l'URL (la stringa non ha la capacità di funzionare quando la stringa ha spazi
Carlos Parada,

147

In Swift 4 e Swift 3 , per convertire String in URL:

URL(string: String)

o,

URL.init(string: "yourURLString")

E per convertire l'URL in stringa:

URL.absoluteString

Quello sotto converte il "contenuto" dell'URL in stringa

String(contentsOf: URL)

25
La seconda parte è errata. String(contentsOf: URL)restituisce il payload effettivo di quella risorsa, non l'URL in formato stringa. Utilizzare URL.absoluteStringper ottenere la versione stringa dell'URL. developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski

4
Stai commettendo lo stesso errore di stackoverflow.com/a/39967995/2227743 in cui confondi la conversione dell'URL stesso in una stringa con la conversione del contenuto scaricato in una stringa. Dovresti rimuovere questa parte della tua risposta perché è completamente sbagliata (o fuori tema, ma alla fine è sbagliata perché non risponde alla domanda).
Eric Aya,

1
35+ persone l'hanno trovato utile e lo hanno votato, preferirei tenerlo così com'è.
Naishta,

72

Esiste un modo migliore per ottenere la versione stringa del percorso da NSURL in Swift:

let path:String = url.path

5
ma tornerà solo /questions/27062454/converting-url-to-string-and-back-againper url/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar il

1
Questo è davvero utile se si desidera utilizzare il percorso per alcuni degli altri metodi FileManager che richiedono un percorso stringa. A loro non piace il file://formato.
Ben Baron,

29

AVVISO : presta attenzione all'URL, è optionale può essere nil. Puoi racchiudere il tuo URL nella citazione per convertirlo in una stringa. Puoi provarlo nel parco giochi.
Aggiornamento per 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)"

1
Va notato che questo restituisce anche il prefisso dello schema (pensa file:///Users/foo). Mentre se è necessario solo il percorso assoluto (pensa /Users/foo), allora url.pathdovrebbe essere usato come nella risposta di @ iphaaw di seguito.
Ahmed Khalaf,

16
let url = URL(string: "URLSTRING HERE")
let anyvar =  String(describing: url)

14

Swift 3 (dimentica di NSURL).

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

Per creare un URL da una stringa:

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

Se vogliamo aggiungere il nome file. Nota che appendingPathComponent () aggiunge automaticamente la codifica percentuale:

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

Quando vogliamo avere String ma senza la parte radice (attenzione che la codifica percentuale viene rimossa automaticamente):

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

Se vogliamo mantenere la parte radice facciamo questo (ma attenzione alla codifica percentuale - non viene rimossa):

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

Per aggiungere manualmente la codifica percentuale per una stringa:

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

Per rimuovere la codifica percentuale:

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

La codifica percentuale è importante perché gli URL per le richieste di rete ne hanno bisogno, mentre gli URL per il file system non funzioneranno sempre, dipende dal metodo effettivo che li utilizza. L'avvertenza qui è che possono essere rimossi o aggiunti automaticamente, quindi è meglio eseguire il debug di queste conversioni con attenzione.


9

Codice versione Swift 3:

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

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 l'estensione per URL?

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

        return "\(val.path)"
    }
}

 utilizzo:

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

1

Swift 3 utilizzato con 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
    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.