Swift 2.1
Einzeiler:
"p1=v1&p2=v2".componentsSeparatedByString("&").map {
$0.componentsSeparatedByString("=")
}.reduce([:]) {
(var dict: [String:String], p) in
dict[p[0]] = p[1]
return dict
}
// ["p1": "v1", "p2": "v2"]
Wird als Erweiterung für NSURL verwendet:
extension NSURL {
/**
* URL query string as dictionary. Empty dictionary if query string is nil.
*/
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 [:]
}
}
}
}
Beispiel:
let url = NSURL(string: "http://example.com?p1=v1&p2=v2")!
let queryDict = url.queryValues
// ["p1": "v1", "p2": "v2"]
Bitte beachten Sie, dass es bei Verwendung von OS X 10.10 oder iOS 8 (oder höher) wahrscheinlich besser ist, NSURLComponentsdie queryItemsEigenschaft zu verwenden und das Wörterbuch NSURLQueryItemsdirekt aus dem zu erstellen .
Hier ist eine NSURLComponentsbasierte NSURLErweiterungslösung:
extension NSURL {
/// URL query string as a dictionary. Empty dictionary if query string is nil.
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
}
}
}
Eine Fußnote zur NSURL-Erweiterung ist, dass es in Swift tatsächlich möglich ist, der Eigenschaft denselben Namen wie der vorhandenen Zeichenfolgeneigenschaft zu geben query. Ich wusste es nicht, bis ich es ausprobiert habe, aber der Polymorphismus in Swift lässt Sie nur beim Rückgabetyp unterscheiden. Wenn also die erweiterte NSURL-Eigenschaft vorhanden ist public var query: [String:String], funktioniert sie. Ich habe dies im Beispiel nicht verwendet, da ich es ein bisschen verrückt finde, aber es funktioniert ...