Преобразование 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
}
}