स्विफ्ट 2.1
एक लाइन:
"p1=v1&p2=v2".componentsSeparatedByString("&").map {
$0.componentsSeparatedByString("=")
}.reduce([:]) {
(var dict: [String:String], p) in
dict[p[0]] = p[1]
return dict
}
NSURL पर विस्तार के रूप में प्रयुक्त:
extension NSURL {
public var queryValues : [String:String] {
get {
if let q = self.query {
return q.componentsSeparatedByString("&").map {
$0.componentsSeparatedByString("=")
}.reduce([:]) {
(var dict: [String:String], p) in
dict[p[0]] = p[1]
return dict
}
} else {
return [:]
}
}
}
}
उदाहरण:
let url = NSURL(string: "http://example.com?p1=v1&p2=v2")!
let queryDict = url.queryValues
कृपया ध्यान दें, यदि OS X 10.10 या iOS 8 (या बाद में) का उपयोग किया जाता है, तो संभवतः इसका उपयोग करना बेहतर है NSURLComponents
और queryItems
संपत्ति और NSURLQueryItems
सीधे से शब्दकोश बनाएं ।
यहाँ एक NSURLComponents
आधारित NSURL
विस्तार समाधान है:
extension NSURL {
public var queryValues : [String:String] {
get {
guard let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false) else {
return [:]
}
guard let queryItems = components.queryItems else {
return [:]
}
var result:[String:String] = [:]
for q in queryItems {
result[q.name] = q.value
}
return result
}
}
}
NSURL एक्सटेंशन के लिए एक फुटनोट यह है कि यह वास्तव में स्विफ्ट में मौजूदा स्ट्रिंग संपत्ति के समान नाम देने के लिए संभव है- query
। मुझे तब तक नहीं पता था जब तक मैंने इसकी कोशिश नहीं की थी, लेकिन स्विफ्ट में बहुरूपता आपको केवल रिटर्न प्रकार पर भिन्न होता है। तो अगर विस्तारित NSURL संपत्ति public var query: [String:String]
यह काम करता है। मैंने इसे उदाहरण में इस्तेमाल नहीं किया क्योंकि मुझे यह थोड़ा पागल लगता है, लेकिन यह काम करता है ...