2014-11-21 6 views
64

So habe ich eine NSURL in eine String konvertiert. Also, wenn ich println es sieht aus wie file:///Users/... usw.Konvertieren von URL in String und wieder zurück

Später ich dies als NSURL zurück wollen, so versuche ich, und wandeln sie zurück, wie unten gesehen, aber ich verlieren zwei der Vorwärts-Schrägstriche, die oben in der String-Version erscheinen, Das wiederum bricht den Code, da url ungültig ist.

Warum ist die Umwandlung zurück zu NSURL Entfernen von zwei nach vorne von den String schlitzt ich es geben, und wie kann ich konvertieren zurück in die NSURL mit drei Schrägstrichen?

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 

Antwort

75

fileURLWithPath() wird verwendet, um einen Klardateipfad (beispielsweise "/ path/to/file") zu einer URL zu konvertieren. Ihre urlString ist eine vollständige URL-Zeichenfolge einschließlich der Regelung, so sollten Sie

let url = NSURL(string: urlstring) 

es zu konvertieren zurück zu NSURL. Beispiel:

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 
+2

Excellent. Oder jetzt in Swift: 'URL (string: urlstring)' –

18

UPDATE: achten Sie auf die URL, kann es in diesem Beispiel gleich null. Sie können Ihre URL in dem Zitat wickeln Sie es in einem String

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

Es sollte beachtet werden, dass dies auch das Schema-Präfix zurückgibt (denke 'file: /// Users/foo'). Wenn nur der absolute Pfad benötigt wird (denke '/ Users/foo'), sollte' url.path' verwendet werden wie in @ iphaaws Antwort unten. –

52

Es ist ein schöner Weg, um die String-Version des Wegs vom NSURL in Swift kennen zu konvertieren:

let path:String = url.path 
+1

, aber es wird nur '/ questions/27062454/converting-url-to-string-and-back-again' für die URL' https://stackoverflow.com/questions/27062454/converting-url-to-string-and zurückgegeben -back-again –

43

In Swift 4 und Swift 3, um String URL zu konvertieren:

URL(string: String) 

oder

URL.init(string: "yourURLString") 

Und URL String zu konvertieren:

URL.absoluteString 

Die unter wandelt die 'Inhalte' der URL-String

String(contentsOf: URL) 
+11

Der zweite Teil ist falsch. 'String (contentsOf: URL)' gibt die tatsächliche Nutzlast dieser Ressource und nicht die URL im String-Format zurück. Verwenden Sie 'URL.absoluteString', um die Zeichenfolgenversion der URL abzurufen. https://developer.apple.com/reference/foundation/nsurl/1409868-absolutstring –

+0

Danke, ich habe es aktualisiert – Naishta

+1

Sie machen den gleichen Fehler wie in https://stackoverflow.com/a/39967995/2227743 Konvertieren Sie die URL selbst in eine Zeichenfolge, indem Sie den heruntergeladenen Inhalt in eine Zeichenfolge konvertieren. Sie sollten diesen Teil Ihrer Antwort entfernen, weil es völlig falsch ist (oder außerhalb des Themas, aber am Ende ist es falsch, weil es die Frage nicht beantwortet). – Moritz

9

Swift 3 (vergiss NSURL).

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

Um eine URL aus einer Zeichenkette machen:

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

Wenn wir die Dateinamen hinzufügen möchten.Beachten Sie, dass appendingPathComponent() automatisch die prozentuale Codierung fügt hinzu:

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

Wenn wir haben String wollen, aber ohne den Wurzelteil (achten, dass Prozent Codierung automatisch entfernt wird):

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

Wenn wir will den Wurzelteil halten wir dies tun (aber die prozentuale Codierung ausmacht - es wird nicht entfernt):

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

um den Prozentsatz der Codierung für eine Zeichenfolge manuell hinzufügen:

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

Um den Prozentsatz der Codierung zu entfernen:

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

Die Prozent-Codierung ist wichtig, weil URLs für Netzwerkanforderungen sie benötigen, während URLs System Datei wird nicht immer funktionieren - es auf dem tatsächlichen hängt Methode, die sie verwendet. Der Nachteil hierbei ist, dass sie automatisch entfernt oder hinzugefügt werden können, damit diese Konvertierungen besser debugged werden.

6

Swift 3 Versionscode:

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

@EricAya Danke. Ich habe den Code überarbeitet. – mriaz0011

1

Swift 3 verwendet mit 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 
    } 

} 
Verwandte Themen