Konversi URL ke String dan kembali lagi

141

Jadi saya telah mengonversikan NSURLke String. Jadi jika saya printlnterlihat seperti file:///Users/...dll.

Kemudian saya ingin ini kembali NSURLjadi saya mencoba dan mengubahnya kembali seperti yang terlihat di bawah, tapi saya kehilangan dua garis miring yang muncul dalam versi string di atas, yang pada gilirannya merusak kode karena urltidak valid.

Mengapa konversi saya kembali ke NSURLmenghapus dua garis miring maju dari Stringsaya berikan, dan bagaimana saya bisa mengkonversi kembali ke NSURLgaris miring tiga yang berisi?

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
sumber
Di Swift 5, untuk mengonversi string ke url adalah Foundation.URL (string: "").
Kanishk Gupta

Jawaban:

122

fileURLWithPath()digunakan untuk mengonversi jalur file biasa (mis. "/ path / ke / file") ke URL. Anda urlStringadalah string URL lengkap termasuk skema, jadi sebaiknya Anda gunakan

let url = NSURL(string: urlstring)

untuk mengubahnya kembali ke NSURL. Contoh:

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
sumber
9
Luar biasa. Atau sekarang di Swift:URL(string: urlstring)
Brent Faust
1
Mungkin Anda memerlukan "urlstring.removingWhitespaces ()", karena URL (string tidak memiliki kapasitas untuk bekerja ketika string memiliki spasi
Carlos Parada
147

Di Swift 4 dan Swift 3 , Untuk mengonversi String ke URL:

URL(string: String)

atau,

URL.init(string: "yourURLString")

Dan untuk mengkonversi URL ke String:

URL.absoluteString

Yang di bawah ini mengubah 'isi' dari url ke string

String(contentsOf: URL)
Naishta
sumber
25
Bagian kedua tidak benar. String(contentsOf: URL)mengembalikan muatan aktual sumber daya itu, bukan URL dalam format string. Gunakan URL.absoluteStringuntuk mendapatkan versi string dari URL. developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski
4
Anda membuat kesalahan yang sama seperti di stackoverflow.com/a/39967995/2227743 di mana Anda mengonversi konversi URL itu sendiri menjadi string dengan mengubah konten yang diunduh menjadi String. Anda harus menghapus bagian ini dari jawaban Anda karena itu sepenuhnya salah (atau di luar topik, tetapi pada akhirnya itu salah karena tidak menjawab pertanyaan).
Eric Aya
1
35+ orang menemukan ini bermanfaat dan meningkatkannya, saya lebih suka menyimpannya apa adanya.
Naishta
72

Ada cara yang lebih baik untuk mendapatkan versi string path dari NSURL di Swift:

let path:String = url.path
iphaaw
sumber
5
tetapi akan kembali hanya /questions/27062454/converting-url-to-string-and-back-againuntuk url/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar
1
Ini sebenarnya sangat berguna jika Anda ingin menggunakan path untuk beberapa metode FileManager lain yang memerlukan path string. Mereka tidak suka file://formatnya.
Ben Baron
29

PEMBERITAHUAN : perhatikan url, itu optionaldan itu bisa nil. Anda dapat membungkus url Anda dalam kutipan untuk mengubahnya menjadi string. Anda bisa mengujinya di taman bermain.
Pembaruan untuk 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
sumber
1
Perlu dicatat bahwa ini mengembalikan juga skema awalan (berpikir file:///Users/foo). Sementara jika hanya jalur absolut diperlukan (pikirkan /Users/foo), maka url.pathharus digunakan seperti dalam jawaban @ iphaaw di bawah ini.
Ahmed Khalaf
16
let url = URL(string: "URLSTRING HERE")
let anyvar =  String(describing: url)
Ahsan
sumber
14

Swift 3 (lupakan NSURL).

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

Untuk membuat URL dari string:

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

Jika kita ingin menambahkan nama file. Perhatikan, appendingPathComponent () menambahkan persen penyandian secara otomatis:

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

Ketika kita ingin memiliki String tetapi tanpa bagian root (perhatikan bahwa persen pengkodean dihapus secara otomatis):

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

Jika kita ingin menyimpan bagian root, kita melakukan ini (tapi ingat persentase penyandiannya - tidak dihapus):

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

Untuk secara manual menambahkan persen penyandian untuk string:

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

Untuk menghapus penyandian persen:

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

Pengkodean persen penting karena URL untuk permintaan jaringan memerlukannya, sementara URL ke sistem file tidak selalu berfungsi - tergantung pada metode aktual yang menggunakannya. Peringatan di sini adalah bahwa mereka dapat dihapus atau ditambahkan secara otomatis, jadi lebih baik debug konversi ini dengan hati-hati.

Vitalii
sumber
9

Kode versi Swift 3:

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

Dan ekstensi untuk URL?

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

        return "\(val.path)"
    }
}

 pemakaian:

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

Swift 3 digunakan dengan 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
sumber