【问题标题】:Converting URL to String and back again将 URL 转换为字符串并再次返回
【发布时间】:2015-01-19 15:55:23
【问题描述】:

所以我将NSURL 转换为String。 所以如果我println 它看起来像file:///Users/... 等等。

稍后我想将其作为NSURL 恢复,因此我尝试将其转换回来,如下所示,但我丢失了上面字符串版本中出现的两个正斜杠,这反过来又破坏了@987654326 的代码@ 无效。

为什么我的转换回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: " ")。

标签: swift nsurl


【解决方案1】:

2020 | SWIFT 5.1:

从 STRING 到 URL:

//ver 1 - better to use it for http/https
//BUT DO NOT use for local paths
let url = URL(string:"https://stackoverflow.com/")

//ver 2 -- for local paths
let url = URL(fileURLWithPath: "//Users/Me/Desktop/Doc.txt")

//ver 3 -- for local folders
let url = URL(fileURLWithPath: "//Users/Me/Desktop", isDirectory: true)

从 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"

网络地址的最佳解决方案是:

let c = url.absoluteString

.path 只会返回 /questions/27062454/converting-url-to-string-and-back-again 为 http(s) 网址 https://stackoverflow.com/questions/27062454/converting-url-to-string-and-back-again 所以对于 http(s) url,最好使用url.absoluteString

【讨论】:

    【解决方案2】:

    注意:注意网址,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
    

    【讨论】:

    • 应该注意这也返回了方案前缀(想想file:///Users/foo)。如果只需要绝对路径(想想/Users/foo),那么url.path 应该像下面@iphaaw 的回答一样使用。
    【解决方案3】:

    Swift 5Swift 4Swift 3将字符串转换为 URL:

    URL(string: String)
    

    或者,

    URL.init(string: "yourURLString")
    

    并将 URL 转换为字符串:

    URL.absoluteString
    

    下面的将url的“内容”转换为字符串

    String(contentsOf: URL)
    

    【讨论】:

    • 第二部分不正确。 String(contentsOf: URL) 返回该资源的实际负载,而不是字符串格式的 URL。使用 URL.absoluteString 获取 URL 的字符串版本。 developer.apple.com/reference/foundation/nsurl/…
    • 您犯了与stackoverflow.com/a/39967995/2227743 相同的错误,您将 URL 本身转换为字符串与将下载的内容转换为字符串。您应该删除这部分答案,因为它完全错误(或离题,但最终它是错误的,因为它没有回答问题)。
    • 超过 35 人发现这很有用并点赞,我宁愿保持原样。
    【解决方案4】:

    斯威夫特 5.

    要将String 转换为URL

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

    要将URL 转换为String

    let urlToString = stringToURL?.absoluteString
    

    【讨论】:

      【解决方案5】:
      let url = URL(string: "URLSTRING HERE")
      let anyvar =  String(describing: url)
      

      【讨论】:

        【解决方案6】:

        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
            }
        
        }
        

        【讨论】:

          【解决方案7】:

          Swift 3 版本代码:

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

          【讨论】:

            【解决方案8】:

            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 并不总是有效 - 这取决于使用它们的实际方法。这里需要注意的是,它们可能会被自动删除或添加,因此最好仔细调试这些转换。

            【讨论】:

              【解决方案9】:

              在 Swift 中有一种更好的方式从 NSURL 获取路径的字符串版本:

              let path:String = url.path
              

              【讨论】:

              • 但它只会返回 /questions/27062454/converting-url-to-string-and-back-again 用于 url https://stackoverflow.com/questions/27062454/converting-url-to-string-and-back-again
              • 如果您想将路径用于需要字符串路径的其他一些 FileManager 方法,这实际上非常有用。他们不喜欢file:// 格式。
              【解决方案10】:

              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 中:URL(string: urlstring)
              • 也许你需要“urlstring.removingWhitespaces()”,因为当字符串有空格时,URL(string 没有能力工作
              猜你喜欢
              • 2013-02-18
              • 2011-01-13
              • 1970-01-01
              • 2011-10-30
              • 1970-01-01
              • 2012-11-01
              • 2011-11-15
              • 1970-01-01
              • 2010-11-28
              相关资源
              最近更新 更多