Convertir URL a cadena y viceversa

141

Entonces he convertido un NSURLa String. Entonces, si me printlnparece, file:///Users/...etc.

Más tarde, quiero esto de nuevo como NSURLasí que trato de convertirlo de nuevo como se ve a continuación, pero pierdo dos de las barras diagonales que aparecen en la versión de cadena anterior, que a su vez rompe el código ya urlque no es válido.

¿Por qué mi conversión vuelve a NSURLeliminar dos barras diagonales de la Stringque le doy, y cómo puedo convertir de nuevo a las NSURLtres barras diagonales que contienen?

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
Gary Simpson
fuente
En Swift 5, convertir string a url es Foundation.URL (string: "").
Kanishk Gupta

Respuestas:

122

fileURLWithPath()se utiliza para convertir una ruta de archivo sin formato (por ejemplo, "/ ruta / a / archivo") en una URL. Su urlStringes una cadena URL completa que incluye el esquema, por lo que debe usar

let url = NSURL(string: urlstring)

para volver a convertirlo NSURL. Ejemplo:

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
Martin R
fuente
9
Excelente. O ahora en Swift:URL(string: urlstring)
Brent Faust
1
Tal vez necesite "urlstring.removingWhitespaces ()", porque la URL (la cadena no tiene la capacidad de funcionar cuando la cadena tiene espacios
Carlos Parada
147

En Swift 4 y Swift 3 , para convertir String a URL:

URL(string: String)

o,

URL.init(string: "yourURLString")

Y para convertir URL a String:

URL.absoluteString

El siguiente convierte los 'contenidos' de la url a cadena

String(contentsOf: URL)
Naishta
fuente
25
La segunda parte es incorrecta. String(contentsOf: URL)devuelve la carga útil real de ese recurso, no la URL en formato de cadena. Use URL.absoluteStringpara obtener la versión de cadena de la URL. developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski
44
Está cometiendo el mismo error que en stackoverflow.com/a/39967995/2227743 donde combina la conversión de la URL en una cadena con la conversión del contenido descargado en una cadena. Debe eliminar esta parte de su respuesta porque está completamente equivocada (o fuera de tema, pero al final está mal porque no responde la pregunta).
Eric Aya
1
Más de 35 personas encontraron esto útil y lo votaron, prefiero mantenerlo como está.
Naishta
72

Hay una mejor manera de obtener la versión de cadena de la ruta desde NSURL en Swift:

let path:String = url.path
iphaaw
fuente
55
pero solo volverá /questions/27062454/converting-url-to-string-and-back-againpor url/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar
1
En realidad, esto es realmente útil si desea utilizar la ruta para algunos de los otros métodos de FileManager que necesitan una ruta de cadena. No les gusta el file://formato.
Ben Baron
29

AVISO : preste atención a la url, es optionaly puede ser nil. Puede ajustar su url en la cita para convertirla en una cadena. Puedes probarlo en el patio de recreo.
Actualización para 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)"
Roger
fuente
1
Cabe señalar que esto devuelve también el prefijo de esquema (pensar file:///Users/foo). Si bien solo se necesita la ruta absoluta (piense /Users/foo), entonces url.pathdebe usarse como en la respuesta de @ iphaaw a continuación.
Ahmed Khalaf
16
let url = URL(string: "URLSTRING HERE")
let anyvar =  String(describing: url)
Ahsan
fuente
14

Swift 3 (olvídate de NSURL).

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

Para hacer una URL de una cadena:

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

Si queremos agregar el nombre del archivo. Tenga en cuenta que appendingPathComponent () agrega el porcentaje de codificación automáticamente:

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

Cuando queremos tener String pero sin la parte raíz (preste atención a que la codificación porcentual se elimina automáticamente):

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

Si queremos mantener la parte raíz, hacemos esto (pero tenga en cuenta el porcentaje de codificación, no se elimina):

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

Para agregar manualmente el porcentaje de codificación para una cadena:

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

Para eliminar el porcentaje de codificación:

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

La codificación porcentual es importante porque las URL para las solicitudes de red las necesitan, mientras que las URL del sistema de archivos no siempre funcionan, depende del método real que las use. La advertencia aquí es que pueden eliminarse o agregarse automáticamente, por lo que es mejor depurar estas conversiones con cuidado.

Vitalii
fuente
9

Código de versión de Swift 3:

let urlString = "file:///Users/Documents/Book/Note.txt"
let pathURL = URL(string: urlString)!
print("the url = " + pathURL.path)
mriaz0011
fuente
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"

Y extensión para URL?

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

        return "\(val.path)"
    }
}

 uso:

let str = optionalUrl.toString() // "/Users/Me/Desktop/Doc.txt"
    str = emptyOptionalUrl.toString() // ""
Andrés
fuente
1

Swift 3 utilizado con 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
    }

}
Raj Joshi
fuente