Swift 2.1
Lót:
"p1=v1&p2=v2".componentsSeparatedByString("&").map {
$0.componentsSeparatedByString("=")
}.reduce([:]) {
(var dict: [String:String], p) in
dict[p[0]] = p[1]
return dict
}
Được sử dụng làm phần mở rộng trên 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 [:]
}
}
}
}
Thí dụ:
let url = NSURL(string: "http://example.com?p1=v1&p2=v2")!
let queryDict = url.queryValues
Xin lưu ý, nếu sử dụng OS X 10.10 hoặc iOS 8 (hoặc mới hơn), có lẽ tốt hơn nên sử dụng NSURLComponents
thuộc queryItems
tính và tạo từ điển từ NSURLQueryItems
trực tiếp.
Đây là một giải pháp mở rộng NSURLComponents
dựa trên 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
}
}
}
Chú thích cuối trang cho phần mở rộng NSURL là trong Swift thực sự có thể đặt thuộc tính trùng tên với thuộc tính chuỗi hiện có— query
. Tôi không biết cho đến khi tôi thử nó, nhưng tính đa hình trong Swift cho phép bạn chỉ khác nhau về kiểu trả về. Vì vậy, nếu thuộc tính NSURL mở rộng thì public var query: [String:String]
nó hoạt động. Tôi đã không sử dụng điều này trong ví dụ vì tôi thấy nó hơi điên rồ, nhưng nó hoạt động ...