स्ट्रिंग और फिर से वापस करने के लिए URL परिवर्तित करना


141

इसलिए मैंने एक में परिवर्तित कर NSURLदिया है String। इसलिए अगर मैं printlnऐसा दिखता हूं file:///Users/...आदि।

बाद में मैं इसे वापस चाहता हूं NSURLताकि मैं कोशिश करूं और इसे नीचे दिए गए रूप में परिवर्तित कर सकूं, लेकिन मैं आगे दिए गए स्ट्रिंग संस्करण में दिखाई देने वाले दो फ़ॉरवर्ड स्लैश खो देता हूं, जो कि कोड को urlअमान्य होने पर तोड़ देता है।

मेरे द्वारा दिए गए 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

स्विफ्ट 5 में, स्ट्रिंग को url में बदलने के लिए Foundation.URL (string: "") है।
कनिष्क गुप्ता

जवाबों:


122

fileURLWithPath()एक सादे फ़ाइल पथ (जैसे "/ पथ / से / फ़ाइल") को 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

9
अति उत्कृष्ट। या अब स्विफ्ट में:URL(string: urlstring)
ब्रेंट फस्ट

1
शायद आपको "urlstring.removingWhitespaces ()" की आवश्यकता है, क्योंकि URL (स्ट्रिंग में रिक्त स्थान होने पर कार्य करने की क्षमता नहीं है
कार्लोस परदा

147

में स्विफ्ट 4 और स्विफ्ट 3 , यूआरएल के लिए स्ट्रिंग बदलने के लिए:

URL(string: String)

या,

URL.init(string: "yourURLString")

और URL को स्ट्रिंग में बदलने के लिए:

URL.absoluteString

नीचे वाला यूआरएल के 'कंटेंट' को स्ट्रिंग में कनवर्ट करता है

String(contentsOf: URL)

25
दूसरा हिस्सा गलत है। String(contentsOf: URL)उस संसाधन का वास्तविक पेलोड लौटाता है, स्ट्रिंग प्रारूप में URL नहीं। URL.absoluteStringURL का स्ट्रिंग संस्करण प्राप्त करने के लिए उपयोग करें । developer.apple.com/reference/foundation/nsurl/…
टॉमिस्लाव मार्कोवस्की

4
आप वही गलती कर रहे हैं जैसे कि stackoverflow.com/a/39967995/2227743 जहां आप URL को स्वयं स्ट्रिंग में डाउनलोड की गई सामग्री को परिवर्तित करने के साथ स्ट्रिंग में कनवर्ट करना स्वीकार करते हैं। आपको अपने उत्तर के इस भाग को हटा देना चाहिए क्योंकि यह पूरी तरह से गलत है (या ऑफ-टॉपिक, लेकिन अंत में यह गलत है क्योंकि यह प्रश्न का उत्तर नहीं देता है)।
एरिक आया

1
35+ लोगों ने इसे उपयोगी पाया और इसे उकेरा, मैं इसे वैसे ही रखूंगा।
नौशता

72

स्विफ्ट में NSURL से मार्ग का स्ट्रिंग संस्करण प्राप्त करने का एक अच्छा तरीका है:

let path:String = url.path

5
लेकिन यह केवल /questions/27062454/converting-url-to-string-and-back-againurl के लिए लौटेगा/programming/27062454/converting-url-to-string-and-back-again
ललित कुमार

1
यह वास्तव में वास्तव में उपयोगी है यदि आप कुछ अन्य FileManager विधियों के लिए पथ का उपयोग करना चाहते हैं जिनके लिए एक स्ट्रिंग पथ की आवश्यकता है। उन्हें file://प्रारूप पसंद नहीं है ।
बेन बैरन

29

सूचना : यूआरएल पर ध्यान दें, optionalयह हो सकता है और हो सकता है nil। इसे स्ट्रिंग में बदलने के लिए आप अपने url को उद्धरण में लपेट सकते हैं। आप इसे खेल के मैदान में परख सकते हैं।
स्विफ्ट 5, एक्सकोड 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)"

1
यह ध्यान दिया जाना चाहिए कि यह रिटर्न भी योजना उपसर्ग (सोच file:///Users/foo) है। जबकि अगर बस निरपेक्ष पथ की आवश्यकता है (सोचें /Users/foo), तो url.pathनीचे @ iphaaw के उत्तर के रूप में उपयोग किया जाना चाहिए।
अहमद खलफ


14

स्विफ्ट 3 (एनएसयूआरएल के बारे में भूल जाओ)।

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

स्विफ्ट 3 संस्करण कोड:

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

4

2020 | स्विफ्ट 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"

और के लिए विस्तार URL?

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

        return "\(val.path)"
    }
}

 उपयोग:

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

1

UIWebViewDelegate shouldStartLoadWith के साथ स्विफ्ट 3 का उपयोग किया गया

  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
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.