【问题标题】:Swift Dictionary FilterSwift 字典过滤器
【发布时间】:2016-02-01 21:28:59
【问题描述】:

所以看起来 Swift (2.x) 字典上的过滤器函数返回一个元组数组。我的问题是有一个优雅的解决方案可以把它变成字典吗?提前致谢。

let dictionary: [String: String] = [
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
]

let newTupleArray: [(String, String)] = dictionary.filter { (tuple: (key: String, value: String)) -> Bool in
    return tuple.key != "key2"
}

let newDictionary: [String: String] = Dictionary(dictionaryLiteral: newTupleArray) // Error: cannot convert value of type '[(String, String)]' to expected argument type '[(_, _)]'

【问题讨论】:

标签: dictionary filter swift2 tuples


【解决方案1】:

如果您正在寻找更实用的方法:

let result = dictionary.filter {
        $0.0 != "key2"
    }
    .reduce([String: String]()) { (var aggregate, elem) in
        aggregate[elem.0] = elem.1
        return aggregate
    }

reduce 这里用于从过滤后的元组构造一个新字典。


编辑:由于 Swift 2.2 中已弃用 var 参数,您需要创建 aggregate 的本地可变副本:

let result = dictionary.filter {
        $0.0 != "key2"
    }
    .reduce([String: String]()) { aggregate, elem in
        var newAggregate = aggregate
        newAggregate[elem.0] = elem.1
        return newAggregate
    }

【讨论】:

  • 我对 swift 2.2 弃用 var 参数感到困惑:你还能使用reduce 来构造字典吗?
  • @lazi74 感谢您的弃用说明。斯威夫特的变化如此迅速而剧烈。请参阅我为 Swift 2.2 兼容代码编辑的答案
【解决方案2】:

您可以扩展 Dictionary 以便将元组序列作为初始值:

extension Dictionary {
  public init<S: SequenceType where S.Generator.Element == (Key, Value)>(_ seq: S) {
      self.init()
      for (k, v) in seq { self[k] = v }
  }
}

然后做

let newDictionary = Dictionary(newTupleArray)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多