Перетворення URL-адреси в рядок і назад


141

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

9
Відмінно. Або зараз у Swift:URL(string: urlstring)
Brent Faust

1
Можливо, вам знадобиться "urlstring.removingWhitespaces ()", тому що URL (рядок не має можливості працювати, коли рядок має пробіли
Carlos Parada

147

В Swift 4 і Swift 3 , для перетворення рядка в URL:

URL(string: String)

або,

URL.init(string: "yourURLString")

І для перетворення URL-адреси в String:

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+ людей вважають це корисним і підтримують його, я вважаю за краще тримати його як є.
Найшта

72

Існує приємніший спосіб отримання рядкової версії шляху від NSURL в Swift:

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://формат.
Бен Барон

29

УВАГА : зверніть увагу на 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

Швидкий 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)

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"

І розширення для 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 повиненStartLoadWith

  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
    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.