Konwersja adresu URL na ciąg i z powrotem

141

Więc przekonwertowałem plik NSURLna String. Więc jeśli tak printlnto wygląda file:///Users/...itd.

Później chcę to z powrotem, NSURLwięc próbuję przekonwertować go z powrotem, jak widać poniżej, ale tracę dwa ukośniki, które pojawiają się w powyższej wersji ciągu, co z kolei powoduje uszkodzenie kodu, ponieważ urljest nieprawidłowy.

Dlaczego moja konwersja powraca do NSURLusunięcia dwóch ukośników z podanego przeze Stringmnie ukośnika i jak mogę przekonwertować z powrotem na NSURLtrzy ukośniki zawierające?

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
źródło
W języku Swift 5 do konwersji ciągu znaków na adres URL służy Foundation.URL (ciąg: "").
Kanishk Gupta

Odpowiedzi:

122

fileURLWithPath()służy do konwersji zwykłej ścieżki do pliku (np. „/ ścieżka / do / pliku”) na adres URL. Your urlStringto pełny ciąg adresu URL zawierający schemat, więc powinieneś użyć

let url = NSURL(string: urlstring)

aby przekonwertować go z powrotem na NSURL. Przykład:

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.
źródło
9
Doskonały. Lub teraz w Swift:URL(string: urlstring)
Brent Faust
1
Może potrzebujesz "urlstring.removingWhitespaces ()", ponieważ URL (ciąg nie ma możliwości działania, gdy ciąg zawiera spacje
Carlos Parada
147

W Swift 4 i Swift 3 , aby przekonwertować ciąg na adres URL:

URL(string: String)

lub,

URL.init(string: "yourURLString")

Aby przekonwertować adres URL na ciąg:

URL.absoluteString

Poniższy konwertuje „zawartość” adresu URL na ciąg

String(contentsOf: URL)
Naishta
źródło
25
Druga część jest nieprawidłowa. String(contentsOf: URL)zwraca rzeczywisty ładunek tego zasobu, a nie adres URL w formacie ciągu. Użyj, URL.absoluteStringaby uzyskać ciągową wersję adresu URL. developer.apple.com/reference/foundation/nsurl/…
Tomislav Markovski
4
Popełniasz ten sam błąd, co w stackoverflow.com/a/39967995/2227743, gdzie łączysz konwersję samego adresu URL na ciąg z konwersją pobranej treści na ciąg. Powinieneś usunąć tę część swojej odpowiedzi, ponieważ jest całkowicie błędna (lub nie na temat, ale ostatecznie jest błędna, ponieważ nie odpowiada na pytanie).
Eric Aya,
1
Ponad 35 osób uznało ten materiał za przydatny i zagłosowało za nim, wolałbym zachować go tak, jak jest.
Naishta
72

Jest lepszy sposób na pobranie ciągowej wersji ścieżki z NSURL w Swift:

let path:String = url.path
iphaaw
źródło
5
ale wróci tylko /questions/27062454/converting-url-to-string-and-back-againdo adresu URL/programming/27062454/converting-url-to-string-and-back-again
Lalit Kumar
1
Jest to naprawdę przydatne, jeśli chcesz użyć ścieżki dla niektórych innych metod FileManager, które wymagają ścieżki ciągu. Nie podoba im się file://format.
Ben Baron
29

UWAGA : zwróć uwagę na adres URL, jest optionali może być nil. Możesz zawinąć swój adres URL w cytat, aby przekształcić go w ciąg. Możesz to przetestować na placu zabaw.
Aktualizacja dla 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)"
zrozumiałem
źródło
1
Należy zauważyć, że zwraca to również przedrostek schematu (myślę file:///Users/foo). Chociaż jeśli potrzebna jest tylko ścieżka absolutna (pomyśl /Users/foo), url.pathpowinna być używana tak, jak w odpowiedzi @ iphaaw poniżej.
Ahmed Khalaf
16
let url = URL(string: "URLSTRING HERE")
let anyvar =  String(describing: url)
Ahsan
źródło
14

Swift 3 (zapomnij o NSURL).

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

Aby utworzyć adres URL z ciągu:

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

Jeśli chcemy dodać nazwę pliku. Zwróć uwagę, że metoda appendingPathComponent () automatycznie dodaje kodowanie procentowe:

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

Kiedy chcemy mieć String, ale bez części głównej (zwróć uwagę, że kodowanie procentowe jest usuwane automatycznie):

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

Jeśli chcemy zachować część główną, robimy to (ale pamiętaj o kodowaniu procentowym - nie jest usuwane):

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

Aby ręcznie dodać kodowanie procentowe dla ciągu:

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

Aby usunąć kodowanie procentowe:

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

Kodowanie procentowe jest ważne, ponieważ adresy URL dla żądań sieciowych ich potrzebują, podczas gdy adresy URL do systemu plików nie zawsze będą działać - zależy to od faktycznej metody, która ich używa. Zastrzeżenie polega na tym, że mogą one zostać usunięte lub dodane automatycznie, więc lepiej ostrożnie debuguj te konwersje.

Vitalii
źródło
9

Kod wersji Swift 3:

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

I rozszerzenie dla URL?

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

        return "\(val.path)"
    }
}

 stosowanie:

let str = optionalUrl.toString() // "/Users/Me/Desktop/Doc.txt"
    str = emptyOptionalUrl.toString() // ""
Andrzej
źródło
1

Swift 3 używany z 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
źródło