Преобразование URL в строку и обратно

поэтому я преобразовал NSURL до String. Так что если я println похоже file:///Users/... etc.

позже я хочу, чтобы это вернулось как NSURL поэтому я пытаюсь преобразовать его обратно, как показано ниже, но я теряю две косые черты, которые появляются в Строковой версии выше, что, в свою очередь, нарушает код как url является недействительным.

почему мое преобразование обратно в NSURL удаление двух косых черт от String Я даю его, и как я могу конвертировать обратно NSURL содержащий три косые черты?

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

8 ответов


fileURLWithPath() используется для преобразования простого пути к файлу (например, "/path/to/file") в URL-адрес. Ваш urlString - это полная строка URL, включая схему, поэтому вы должны использовать

let url = NSURL(string: urlstring)

чтобы преобразовать его обратно в NSURL. Пример:

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

на Swift 4 и Swift 3, чтобы преобразовать строку в URL:

URL(string: String)

или

URL.init(string: "yourURLString")

и преобразовать URL в строку:

URL.absoluteString

ниже преобразует "содержимое" url-адреса в строку

String(contentsOf: URL)

есть более приятный способ получить строковую версию пути из NSURL в Swift:

let path:String = url.path

UPDATE: обратите внимание на url, он может быть равен нулю в этом примере. Вы можете обернуть свой url в цитату, чтобы преобразовать его в строку

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

Swift 3 (забудьте о NSURL).

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

чтобы сделать URL из строки:

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

если мы хотим добавить именем. Обратите внимание, что appendingPathComponent () автоматически добавляет процентную кодировку:

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

когда мы хотим иметь строку, но без корневой части (обратите внимание, что процентная кодировка удаляется автоматически):

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

если мы хотим сохранить корневую часть мы делаем это (но учти процент кодировка-не удаляется):

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

чтобы вручную добавить процентную кодировку для строки:

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

чтобы удалить процентную кодировку:

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

процентная кодировка важна, потому что URL-адреса для сетевых запросов нуждаются в них, в то время как URL - адреса файловой системы не всегда будут работать-это зависит от фактического метода, который их использует. Предостережение здесь заключается в том, что они могут быть удалены или добавлены автоматически, поэтому лучше тщательно отлаживать эти преобразования.


Swift 3 код версии:

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

Swift 3 используется с 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
    }

}

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