URL'yi Dize ve tekrar geri dönüştürme


141

Bu yüzden bir 'i' NSURLye dönüştürdüm String. Yani eğer printlnbenziyorsa file:///Users/...vb.

Daha sonra bu şekilde geri istiyorum NSURLve aşağıda görüldüğü gibi geri dönüştürmek istiyorum, ancak yukarıdaki dize sürümünde görünen ileri eğik çizgiler iki kaybetmek, sırayla kodu urlgeçersiz olarak kırır.

Neden verdiğim NSURLiki eğik çizgiyi kaldırmaya dönüşüyorum Stringve NSURLiçeren üç eğik çizgiye nasıl dönüştürebilirim ?

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'te, string'i url'ye dönüştürmek Foundation.URL'dir (string: "").
Kanishk Gupta

Yanıtlar:


122

fileURLWithPath()düz dosya yolunu (örneğin "/ path / to / file") bir URL'ye dönüştürmek için kullanılır. Şemanız urlString, şema dahil tam bir URL dizesidir, bu nedenle

let url = NSURL(string: urlstring)

dönüştürmek NSURL. Misal:

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
Mükemmel. Ya da şimdi Swift'te:URL(string: urlstring)
Brent Faust

1
Belki de "urlstring.removingWhitespaces ()" gereklidir, çünkü URL (dize, dizede boşluk olduğunda çalışma kapasitesine sahip değildir
Carlos Parada

147

In Swift 4 ve Swift 3 , URL'ye Dize dönüştürmek için:

URL(string: String)

veya,

URL.init(string: "yourURLString")

URL'yi Dizeye dönüştürmek için:

URL.absoluteString

Aşağıdaki metin URL'nin 'içeriğini' dizeye dönüştürür

String(contentsOf: URL)

25
İkinci bölüm yanlış. String(contentsOf: URL)URL'nin dize biçiminde değil, o kaynağın gerçek yükünü döndürür. URL.absoluteStringURL'nin dize sürümünü almak için kullanın . developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski

4
İndirilen içeriği bir Dizeye dönüştürerek URL'nin kendisini bir dizeye dönüştürmekle yüklediğiniz stackoverflow.com/a/39967995/2227743 ile aynı hatayı yapıyorsunuz . Cevabınızın bu kısmını tamamen yanlış (ya da konu dışı olduğu için kaldırmalısınız, ama sonunda yanlış, çünkü soruyu cevaplamıyor).
Eric Aya

1
35+ kişi bunu yararlı buldu ve onayladı, onu olduğu gibi tutmayı tercih ederim.
Naishta

72

Swift'te NSURL'den yolun dize sürümünü almanın daha güzel bir yolu var:

let path:String = url.path

5
ancak yalnızca /questions/27062454/converting-url-to-string-and-back-againurl için dönecek/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar

1
Dize yolu gerektiren diğer FileManager yöntemlerinden bazılarında yolu kullanmak istiyorsanız bu gerçekten yararlıdır. file://Biçimi sevmiyorlar .
Ben Baron

29

DİKKAT : url'ye dikkat edin, optionalolabilir ve olabilir nil. URL'nizi bir dizeye dönüştürmek için alıntıya koyabilirsiniz. Oyun alanında test edebilirsiniz.
Swift 5, Xcode 11 için güncelleme:

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
Bunun şema önekini de döndürdüğüne dikkat edilmelidir (düşün file:///Users/foo). Sadece mutlak yol gerekiyorsa (düşün /Users/foo), o zaman url.path@ iphaaw'ın cevabında olduğu gibi kullanılmalıdır.
Ahmed Khalaf

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

14

Swift 3 (NSURL'u unutma).

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

Bir dizeden URL oluşturmak için:

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

Dosya adını eklemek istiyorsak. AppendingPathComponent () yönteminin kodlama yüzdesini otomatik olarak eklediğini unutmayın:

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

String'e sahip olmak istediğimiz halde kök kısmı olmadan (yüzde kodlamanın otomatik olarak kaldırıldığına dikkat edin):

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

Kök kısmını tutmak istiyorsak bunu yaparız (ancak kodlama yüzdesine dikkat edin - kaldırılmaz):

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

Bir dizeye ilişkin kodlama yüzdesini manuel olarak eklemek için:

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

Kodlama yüzdesini kaldırmak için:

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

Yüzde kodlama önemlidir, çünkü ağ istekleri için URL'lerin bunlara ihtiyacı vardır, ancak dosya sistemine URL'ler her zaman çalışmaz - bu, onları kullanan gerçek yönteme bağlıdır. Buradaki uyarı, otomatik olarak kaldırılabilmeleri veya eklenebilmeleridir, bu nedenle bu dönüşümleri dikkatlice hata ayıklayın.


9

Swift 3 sürüm kodu:

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"

Ve uzantısı URL?

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

        return "\(val.path)"
    }
}

 kullanımı:

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

1

UIWebViewDelegate ile birlikte kullanılan Swift 3 gerekir

  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
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.