将 `[URLQueryItem]` 减少为 `[String: Any]`

Fog*_*ter 3 reduce swift

目前我有这个矮胖的reduce功能......

blah: [String: Any] = queryItems.reduce([String: Any]()) {
    (params: [String: Any], queryItem: URLQueryItem) in

    var output = params

    output[queryItem.name] = queryItem.value

    return output
}
Run Code Online (Sandbox Code Playgroud)

我确信有一种更简单的方法可以做到这一点,但我无法理解它是如何工作的。

有一个更好的方法吗?

“更好”是指更干净、更短、更优雅等……

Dav*_*ist 6

可以使用reduce(into:_:)代替reduce(_:_). 这既可params以为您节省行数和每次迭代复制的开销:

let blah: [String: Any] = (urlComponents.queryItems ?? []).reduce(into: [:]) {
    params, queryItem in 
    params[queryItem.name] = queryItem.value
}
Run Code Online (Sandbox Code Playgroud)

reduce(_:_:)当结果是写时复制类型(例如数组或字典)时,此方法优于效率。

  • Swift 是一种类型推断语言。顺便说一句,你可以在这里简单地使用可选链`let blah = urlComponents.queryItems?.reduce(into: [:]) { $0[$1.name] = $1.value } ?? [:]` 如果值始终是字符串,则无需使用 Any 作为值类型 (3认同)
  • `reduce(into:)` 是最近 Swift 的那些伟大的未知宝石之一。最后使非标量 `reduce` 可用。 (2认同)