2014-11-21 24 views
64

Così ho trasformato un NSURL ad un String. Quindi, se ho println Sembra file:///Users/... eccConversione URL String e viceversa

Più tardi voglio questo ritorno come NSURL così cerco e riconvertirlo come si vede qui sotto, ma perdo due dei slash che compaiono nella versione stringa di cui sopra, che a sua volta interrompe il codice poiché lo url non è valido.

Perché è la mia conversione torna a NSURL rimozione di due barre dal String dò, e come posso riconvertire al NSURL contenente tre barre?

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 

risposta

75

fileURLWithPath() viene utilizzato per convertire un percorso di file semplice (ad esempio "/ path/to/file") per un URL. Il tuo urlString è una stringa URL completo, compreso lo schema, così si dovrebbe usare

let url = NSURL(string: urlstring) 

per riconvertirlo NSURL. Esempio:

+2

eccellente. O ora in Swift: 'URL (stringa: urlstring)' –

18

AGGIORNAMENTO: prestare attenzione all'url, può essere nullo in questo esempio. Puoi avvolgere il vostro URL nella citazione per convertirlo in una stringa

let urlString = "http://ifconfig.me" 
//string to url 
let url = NSURL(string: urlString) 
//url to string 
let string = "\(url)" 
+0

Va notato che questo restituisce anche il prefisso dello schema (si pensi 'file: /// Users/foo'). Mentre se è necessario solo il percorso assoluto (si pensi '/ Users/foo'), allora' url.path' dovrebbe essere usato come nella risposta di @ iphaaw qui sotto. –

52

C'è un modo migliore di ottenere la versione di stringa del percorso dal NSURL a Swift:

let path:String = url.path 
+1

ma restituirà solo '/ questions/27062454/converting-url-to-string-and-back-again' per url' https://stackoverflow.com/questions/27062454/converting-url-to-string-and -back-again' –

43

In Swift 4 e Swift 3, Conversione di stringhe in URL:

URL(string: String) 

o,

URL.init(string: "yourURLString") 

E per convertire URL String:

URL.absoluteString 

quella qui sotto converte i 'contenuti' della url a stringa

String(contentsOf: URL) 
+11

La seconda parte non è corretta. 'String (contentsOf: URL)' restituisce il carico utile effettivo di quella risorsa, non l'URL in formato stringa. Usa 'URL.absoluteString' per ottenere la versione stringa dell'URL. https://developer.apple.com/reference/foundation/nsurl/1409868-absolutestring –

+0

Grazie, l'ho aggiornato – Naishta

+1

Stai facendo lo stesso errore di https://stackoverflow.com/a/39967995/2227743 dove si configura 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). – Moritz

9

Swift 3 (dimentica NSURL).

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

Per effettuare un'URL da una stringa:

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

Se vogliamo aggiungere il nome del file.Si noti, che appendingPathComponent() aggiunge la codifica per cento automaticamente:

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 principale (attenzione che codifica per cento viene rimosso automaticamente):

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

Se noi vogliono mantenere la parte di radice facciamo questo (ma mente la codifica per cento - non viene rimosso):

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

per aggiungere manualmente la codifica per cento 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 per cento:

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

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

6

Swift codice 3 Versione:

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

@EricAya Grazie. Ho rivisto il codice. – mriaz0011

1

Swift 3 utilizzati 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 
    } 

} 
Problemi correlati