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
Gary Simpson
quelle
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
Martin R.
quelle
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)
Naishta
quelle
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
iphaaw
quelle
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)"
Roger
quelle
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)
Ahsan
quelle
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.

Vitalii
quelle
9

Swift 3 Versionscode:

let urlString = "file:///Users/Documents/Book/Note.txt"
let pathURL = URL(string: urlString)!
print("the url = " + pathURL.path)
mriaz0011
quelle
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() // ""
Andrew
quelle
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
    }

}
Raj Joshi
quelle