Konvertieren der URL in einen String und wieder zurück


141

Also habe ich ein NSURLzu einem konvertiert String. Also wenn ich printlnso aussehe file:///Users/...etc.

Später möchte ich dies zurück als, NSURLalso versuche ich es zurück zu konvertieren, wie unten gezeigt, aber ich verliere zwei der Schrägstriche, die in der obigen String-Version erscheinen, was wiederum den Code bricht, da der urlungültig ist.

Warum wird bei meiner Konvertierung wieder NSURLzwei Schrägstriche aus dem von Stringmir angegebenen Wert entfernt, und wie kann ich wieder in die NSURLdrei Schrägstriche konvertieren ?

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 lautet die Konvertierung einer Zeichenfolge in eine URL Foundation.URL (Zeichenfolge: "").
Kanishk Gupta

Antworten:


122

fileURLWithPath()wird verwendet, um einen einfachen Dateipfad (z. B. "/ path / to / file") in eine URL zu konvertieren. Ihre urlStringist eine vollständige URL-Zeichenfolge einschließlich des Schemas, daher sollten Sie verwenden

let url = NSURL(string: urlstring)

um es wieder zu konvertieren 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

9
Ausgezeichnet. Oder jetzt in Swift:URL(string: urlstring)
Brent Faust

1
Möglicherweise benötigen Sie "urlstring.removingWhitespaces ()", da URL (Zeichenfolge nicht funktionsfähig ist, wenn die Zeichenfolge Leerzeichen enthält
Carlos Parada

147

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

URL(string: String)

oder,

URL.init(string: "yourURLString")

Und um die URL in einen String umzuwandeln:

URL.absoluteString

Der folgende konvertiert den 'Inhalt' der URL in einen String

String(contentsOf: URL)

25
Der zweite Teil ist falsch. String(contentsOf: URL)Gibt die tatsächliche Nutzlast dieser Ressource zurück, nicht die URL im Zeichenfolgenformat. Verwenden Sie URL.absoluteStringdiese Option , um die Zeichenfolgenversion der URL abzurufen. developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski

4
Sie machen den gleichen Fehler wie in stackoverflow.com/a/39967995/2227743, wo Sie die Konvertierung der URL selbst in eine Zeichenfolge mit der Konvertierung des heruntergeladenen Inhalts in eine Zeichenfolge verbinden. Sie sollten diesen Teil Ihrer Antwort entfernen, weil er völlig falsch ist (oder nicht zum Thema gehört, aber am Ende ist er falsch, weil er die Frage nicht beantwortet).
Eric Aya

1
Über 35 Leute fanden das nützlich und haben es positiv bewertet. Ich würde es lieber so lassen, wie es ist.
Naishta

72

Es gibt eine bessere Möglichkeit, die String-Version des Pfads von der NSURL in Swift abzurufen:

let path:String = url.path

5
aber es wird nur /questions/27062454/converting-url-to-string-and-back-againfür URL zurückkehren/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar

1
Dies ist sehr nützlich, wenn Sie den Pfad für einige der anderen FileManager-Methoden verwenden möchten, für die ein Zeichenfolgenpfad erforderlich ist. Sie mögen das file://Format nicht.
Ben Baron

29

HINWEIS : Achten Sie auf die URL, es ist optionalund es kann sein nil. Sie können Ihre URL in das Zitat einschließen, um sie in eine Zeichenfolge umzuwandeln. Sie können es auf dem Spielplatz testen.
Update für 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
Es ist zu beachten, dass dies auch das Schema-Präfix (think file:///Users/foo) zurückgibt . Wenn nur der absolute Pfad benötigt wird (denken Sie nach /Users/foo), url.pathsollte dies wie in der Antwort von @ iphaaw unten verwendet werden.
Ahmed Khalaf

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

14

Swift 3 (vergiss NSURL).

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

So erstellen Sie eine URL aus einer Zeichenfolge:

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

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

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

Wenn wir String haben möchten, aber ohne den Root-Teil (achten Sie darauf, dass die prozentuale Codierung automatisch entfernt wird):

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

Wenn wir den Stammteil behalten möchten, tun wir dies (aber beachten Sie die prozentuale Codierung - sie wird nicht entfernt):

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

So fügen Sie die prozentuale Codierung für eine Zeichenfolge manuell hinzu:

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

So entfernen Sie die prozentuale Codierung:

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

Die prozentuale Codierung ist wichtig, da URLs für Netzwerkanforderungen diese benötigen, während URLs zum Dateisystem nicht immer funktionieren - dies hängt von der tatsächlichen Methode ab, mit der sie verwendet werden. Die Einschränkung hierbei ist, dass sie möglicherweise automatisch entfernt oder hinzugefügt werden. Debuggen Sie diese Konvertierungen daher besser sorgfältig.


9

Swift 3 Versionscode:

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"

Und Erweiterung für URL?

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

        return "\(val.path)"
    }
}

 Verwendung:

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

1

Swift 3, das mit UIWebViewDelegate verwendet wird, sollteStartLoadWith

  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
    }

}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.