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, NSURLComponents
die queryItems
Eigenschaft zu verwenden und das Wörterbuch NSURLQueryItems
direkt aus dem zu erstellen .
Hier ist eine NSURLComponents
basierte NSURL
Erweiterungslö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 ...