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

Итак, я преобразовал NSURL в String. Поэтому, если я println выглядит как file:///Users/... и т.д.

Позже я хочу, чтобы это было как 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

Ответ 1

fileURLWithPath() используется для преобразования пути обычного файла (например, "/путь/в/файл" ) к 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

Ответ 2

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

let path:String = url.path

Ответ 3

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

URL(string: String)

или,

URL.init(string: "yourURLString")

И для преобразования URL в String:

URL.absoluteString

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

String(contentsOf: URL)

Ответ 4

ОБНОВЛЕНИЕ: обратите внимание на URL-адрес, в этом примере это может быть нуль. Вы можете перенести свой url в цитату, чтобы преобразовать ее в строку

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

Ответ 5

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

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

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-адреса в файловой системе не всегда работают - это зависит от фактического метода, который их использует. Опасность здесь заключается в том, что они могут быть удалены или добавлены автоматически, поэтому лучше отлаживайте эти преобразования.

Ответ 6

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

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

Ответ 7

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
    }

}