Chuyển đổi URL thành Chuỗi và quay lại


141

Vì vậy, tôi đã chuyển đổi một NSURLđể a String. Vì vậy, nếu tôi printlntrông giống như file:///Users/...vv

Sau này tôi muốn điều này trở lại NSURLvì vậy tôi đã thử và chuyển đổi nó trở lại như được thấy bên dưới, nhưng tôi mất hai dấu gạch chéo xuất hiện trong phiên bản chuỗi ở trên, đến lượt nó phá vỡ mã vì urlkhông hợp lệ.

Tại sao chuyển đổi của tôi trở lại để NSURLloại bỏ hai dấu gạch chéo về phía trước từ cái Stringtôi đưa ra và làm cách nào tôi có thể chuyển đổi trở lại thành NSURLba dấu gạch chéo phía trước?

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

Trong Swift 5, để chuyển đổi chuỗi thành url là Foundation.URL (chuỗi: "").
K Biếnk Gupta

Câu trả lời:


122

fileURLWithPath()được sử dụng để chuyển đổi đường dẫn tệp đơn giản (ví dụ: "/ path / to / file") thành một URL. Của bạn urlStringlà một chuỗi URL đầy đủ bao gồm cả lược đồ, vì vậy bạn nên sử dụng

let url = NSURL(string: urlstring)

để chuyển đổi nó trở lại NSURL. Thí dụ:

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
Thông minh. Hoặc bây giờ trong Swift:URL(string: urlstring)
Brent Faust

1
Có thể bạn cần "url chuỗi.removingWhitespaces ()", vì URL (chuỗi không có khả năng hoạt động khi chuỗi có khoảng trắng
Carlos Parada

147

Trong Swift 4Swift 3 , Để chuyển đổi Chuỗi thành URL:

URL(string: String)

hoặc là,

URL.init(string: "yourURLString")

Và để chuyển đổi URL thành Chuỗi:

URL.absoluteString

Cái bên dưới chuyển đổi 'nội dung' của url thành chuỗi

String(contentsOf: URL)

25
Phần thứ hai không chính xác. String(contentsOf: URL)trả về tải trọng thực tế của tài nguyên đó, không phải URL ở định dạng chuỗi. Sử dụng URL.absoluteStringđể có được phiên bản chuỗi của URL. developer.apple.com/reference/foundation/nsurl/
Kẻ

4
Bạn đang mắc lỗi tương tự như trong stackoverflow.com/a/39967995/2227743 khi bạn xác nhận chuyển đổi chính URL thành một chuỗi bằng cách chuyển đổi nội dung được tải xuống thành Chuỗi. Bạn nên loại bỏ phần này trong câu trả lời của mình vì nó hoàn toàn sai (hoặc lạc đề, nhưng cuối cùng nó sai vì nó không trả lời câu hỏi).
Eric Aya

1
Hơn 35 người tìm thấy điều này hữu ích và nâng cao nó, tôi thà giữ nó như vậy.
Naishta

72

Có một cách hay hơn để lấy phiên bản chuỗi của đường dẫn từ NSURL trong Swift:

let path:String = url.path

5
nhưng nó sẽ chỉ trả lại /questions/27062454/converting-url-to-string-and-back-againcho url/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar

1
Điều này thực sự hữu ích nếu bạn muốn sử dụng đường dẫn cho một số phương thức FileManager khác cần đường dẫn chuỗi. Họ không thích file://định dạng.
Ben Baron

29

THÔNG BÁO : chú ý đến url, optionalnó có thể nil. Bạn có thể gói url của bạn trong trích dẫn để chuyển đổi nó thành một chuỗi. Bạn có thể kiểm tra nó trong sân chơi.
Cập nhật cho 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
Cần lưu ý rằng điều này cũng trả về tiền tố lược đồ (nghĩ file:///Users/foo). Mặc dù nếu chỉ cần đường dẫn tuyệt đối (nghĩ /Users/foo), thì url.pathnên sử dụng như trong câu trả lời của @ iphaaw bên dưới.
Ahmed Khalaf

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

14

Swift 3 (quên về NSURL).

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

Để tạo một URL trong chuỗi:

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

Nếu chúng ta muốn thêm tên tệp. Lưu ý, appendingPathComponent () tự động thêm phần trăm mã hóa:

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

Khi chúng tôi muốn có Chuỗi nhưng không có phần gốc (chú ý rằng phần trăm mã hóa được xóa tự động):

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

Nếu chúng tôi muốn giữ phần gốc, chúng tôi sẽ thực hiện việc này (nhưng lưu ý phần trăm mã hóa - phần này không bị xóa):

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

Để tự thêm mã hóa phần trăm cho chuỗi:

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

Để xóa phần trăm mã hóa:

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

Mã hóa phần trăm rất quan trọng vì URL cho các yêu cầu mạng cần chúng, trong khi URL cho hệ thống tệp sẽ không luôn hoạt động - điều này phụ thuộc vào phương pháp thực tế sử dụng chúng. Thông báo trước ở đây là chúng có thể được gỡ bỏ hoặc thêm tự động, vì vậy tốt hơn nên gỡ lỗi các chuyển đổi này một cách cẩn thận.


9

Mã phiên bản Swift 3:

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

4

2020 | Chuyển đổi 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"

Và mở rộng cho URL?

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

        return "\(val.path)"
    }
}

 sử dụng:

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

1

Swift 3 được sử dụng với UIWebViewDelegate nênStartLoadWith

  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
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.