将URL转换为String并再次返回


141

因此,我已将转换NSURLString。所以,如果我println看起来像file:///Users/...等。

后来我希望将其恢复为a,NSURL因此我尝试将其转换回如下所示,但是我丢失了上面的字符串版本中出现的两个正斜杠,从而由于in url无效而破坏了代码。

为什么我的转换又回到NSURLString给出的斜杠中删除两个正斜杠的方式,又如何才能转换回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:“”)。
Kanishk Gupta,

Answers:


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(string在字符串中有空格时不具有工作能力
Carlos Parada

147

Swift 4Swift 3中要将String转换为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/...
托米斯拉夫Markovski

4
您犯的错误与stackoverflow.com/a/39967995/2227743中的错误相同,在该错误中,您将URL本身转换为字符串,而将下载的内容转换为String,则混为一谈。您应该删除答案的这一部分,因为它完全是错误的(或者是题外话,但最后是错误的,因为它没有回答问题)。
Eric Aya

1
35个以上的人发现此功能有用并赞成,我宁愿保持原状。
Naishta

72

在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://格式。
本·男爵

29

注意:请注意url,optional它可以是nil。您可以将网址括在引号中,以将其转换为字符串。您可以在操场上进行测试。
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
应当注意,这还会返回方案前缀(think file:///Users/foo)。如果仅需要绝对路径(请考虑/Users/foo),则url.path应按以下@iphaaw的答案使用。
艾哈迈德·克拉夫

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

14

Swift 3(忘了NSURL)。

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

要使用字符串制作网址:

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

与UIWebViewDelegate一起使用的Swift 3 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
    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.