Swift 2.1
Oneliner:
"p1=v1&p2=v2".componentsSeparatedByString("&").map {
$0.componentsSeparatedByString("=")
}.reduce([:]) {
(var dict: [String:String], p) in
dict[p[0]] = p[1]
return dict
}
Używany jako rozszerzenie 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 [:]
}
}
}
}
Przykład:
let url = NSURL(string: "http://example.com?p1=v1&p2=v2")!
let queryDict = url.queryValues
Należy pamiętać, że jeśli używasz OS X 10.10 lub iOS 8 (lub nowszego), prawdopodobnie lepiej jest użyć NSURLComponents
i queryItems
właściwości i utworzyć słownik NSURLQueryItems
bezpośrednio z.
Oto rozwiązanie NSURLComponents
oparte na NSURL
rozszerzeniu:
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
}
}
}
Przypisem do rozszerzenia NSURL jest to, że w języku Swift można nadać właściwości taką samą nazwę, jak istniejąca właściwość ciągu - query
. Nie wiedziałem, dopóki tego nie wypróbowałem, ale polimorfizm w Swift pozwala ci różnić się tylko typem zwrotu. Więc jeśli rozszerzona właściwość NSURL public var query: [String:String]
działa. Nie użyłem tego w przykładzie, ponieważ uważam to za trochę szalone, ale działa ...