Dictionary 快速字典过滤器

Dictionary 快速字典过滤器,dictionary,filter,swift2,tuples,Dictionary,Filter,Swift2,Tuples,因此,Swift 2.x字典上的filter函数似乎返回一个元组数组。我的问题是,有没有一个优雅的办法可以把它重新编入字典?提前谢谢 let dictionary: [String: String] = [ "key1": "value1", "key2": "value2", "key3": "value3" ] let newTupleArray: [(String, String)] = dictionary.filter { (tuple: (key: Stri

因此,Swift 2.x字典上的filter函数似乎返回一个元组数组。我的问题是,有没有一个优雅的办法可以把它重新编入字典?提前谢谢

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 '[(_, _)]'

您可以扩展字典,使其以元组序列作为初始值:

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 result = dictionary.filter {
        $0.0 != "key2"
    }
    .reduce([String: String]()) { (var aggregate, elem) in
        aggregate[elem.0] = elem.1
        return aggregate
    }
reduce-here用于从过滤后的元组构造新字典

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


可能与swift 2.2弃用var参数的版本重复:您仍然可以使用reduce构建字典吗?@laz74感谢弃用说明。斯威夫特的变化如此之快和戏剧性。有关符合Swift 2.2标准的代码,请参见我编辑的答案
let result = dictionary.filter {
        $0.0 != "key2"
    }
    .reduce([String: String]()) { (var aggregate, elem) in
        aggregate[elem.0] = elem.1
        return aggregate
    }
let result = dictionary.filter {
        $0.0 != "key2"
    }
    .reduce([String: String]()) { aggregate, elem in
        var newAggregate = aggregate
        newAggregate[elem.0] = elem.1
        return newAggregate
    }