Swift字典图-闭包初始化

Pre*_*eek 2 dictionary ios swift

我有Swift字典:

private var params = [String : AnyObject]()
Run Code Online (Sandbox Code Playgroud)

它包含查询项,例如:

  • "lat" = "40"
  • "lon" = "100"

我想将此字典映射到NSURLQueryItem数组。我想使其“笨拙”:

params.map{NSURLQueryItem.init}
Run Code Online (Sandbox Code Playgroud)

但是我得到一个错误。即使我将地图更改为[String:String?]。我知道我可以做一些像这样优雅的单线工作。谁能告诉我如何?

Luc*_*tti 6

您只需要添加一个failable initializerNSURLQueryItem这样的元组即可(String, AnyObject)

extension NSURLQueryItem {
    convenience init?(tuple: (String, AnyObject)) {
        guard let value = tuple.1 as? String else { return nil }
        self.init(name: tuple.0, value: value)
    }
}
Run Code Online (Sandbox Code Playgroud)

而已!

let params: [String:AnyObject] = ["lat": "40", "lon": "100"]
let queryItems = params.flatMap(NSURLQueryItem.init)
Run Code Online (Sandbox Code Playgroud)

  • 真是太好了!:) (2认同)

Ata*_*eis 5

您对字典的值是否需要是可选的?在字典中,当您将其键分配为 nil 时,该条目将被删除。

var params = [String:String?]()
params["lat"] = "40"
params["lon"] = "100"
params["key"] = "hey"
print(params) //result: ["lat": Optional("40"), "lon": Optional("100"), "key": Optional("hey")]
params["key"] = nil
print(params) //result: ["lat": Optional("40"), "lon": Optional("100")]
Run Code Online (Sandbox Code Playgroud)

我建议使用非可选值字典。我已经成功编写了以下代码:

import UIKit

var params = [String:String]()
params["lat"] = "40"
params["lon"] = "100"
let nsurl = params.map() {NSURLQueryItem.init(name: $0, value: $1)}
print(nsurl)
//Result:
//[<NSURLQueryItem 0x7f8252d29730> {name = lat, value = 40}, <NSURLQueryItem 0x7f8252d29700> {name = lon, value = 100}]
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助