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


146

Итак, я преобразовал файл 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

В Swift 5 для преобразования строки в url используется Foundation.URL (string: "").
Канишк Гупта

Ответы:


122

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

9
Превосходно. Или сейчас в Swift:URL(string: urlstring)
Brent Faust

1
Может быть, вам нужен urlstring.removingWhitespaces (), потому что URL (строка не может работать, когда строка имеет пробелы
Карлос Парада,

152

В Swift 4 и Swift 3 , для преобразования строки в URL:

URL(string: String)

или,

URL.init(string: "yourURLString")

И чтобы преобразовать URL в строку:

URL.absoluteString

Тот, что ниже, преобразует "содержимое" URL-адреса в строку

String(contentsOf: URL)

25
Вторая часть неверна. String(contentsOf: URL)возвращает фактическую полезную нагрузку этого ресурса, а не URL-адрес в строковом формате. Используйте URL.absoluteStringдля получения строковой версии URL-адреса. developer.apple.com/reference/foundation/nsurl/…
Томислав Марковский

4
Вы делаете ту же ошибку, что и в stackoverflow.com/a/39967995/2227743, где вы объединяете преобразование самого URL-адреса в строку с преобразованием загруженного содержимого в строку. Вам следует удалить эту часть своего ответа, потому что она полностью неверна (или не по теме, но, в конце концов, она неверна, потому что не отвечает на вопрос).
Эрик Айя

1
Более 35 человек нашли это полезным и проголосовали за него, я бы предпочел оставить его как есть.
Naishta

73

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

let path:String = url.path

5
но он вернется только /questions/27062454/converting-url-to-string-and-back-againдля url/programming/27062454/converting-url-to-string-and-back-again
Лалит Кумар

1
Это действительно полезно, если вы хотите использовать путь для некоторых других методов FileManager, которым требуется строковый путь. Им не нравится file://формат.
Бен Барон

30

ВНИМАНИЕ : обратите внимание на url, это optionalи может быть nil. Вы можете заключить URL-адрес в кавычки, чтобы преобразовать его в строку. Можете опробовать на детской площадке.
Обновление для 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
Следует отметить, что это также возвращает префикс схемы (думать file:///Users/foo). Хотя, если требуется только абсолютный путь (подумайте /Users/foo), его url.pathследует использовать, как в ответе @ iphaaw ниже.
Ахмед Халаф


14

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


9

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

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

9

2020 | SWIFT 5.1:

От STRING до URL:

let url = URL(fileURLWithPath: "//Users/Me/Desktop/Doc.txt")

С URL на STRING:

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" 

НО значение dбудет невидимым из-за процесса отладки, поэтому ...

ЛУЧШЕЕ РЕШЕНИЕ:

let e = "\(url.path)"                 // "/Users/Me/Desktop/Doc.txt"

И расширение для URL?

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

        return "\(val.path)"
    }
}

 Применение:

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

1

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
    }

}

0

Свифт 5.

Чтобы преобразовать a Stringв a URL:

let stringToURL = URL(string: "your-string")

Чтобы преобразовать a URLв a String:

let urlToString = stringToURL?.absoluteString
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.