在Swift 2中使用Dictionary上的map,返回一个Dictionary

Zac*_*Zac 11 dictionary swift swift2

我无法弄清楚Swift 2的特殊风格map:

我正在读一本字典(来自plist文件),所以我有一个[String: AnyObject]:

let dictionary = NSDictionary(contentsOfFile: path) as? [String: AnyObject] 
Run Code Online (Sandbox Code Playgroud)

我的目标是从字典Strings转换为记录器实例字典.这将是[String: XCGLogger]:

let loggers = dictionary
    .map { (n, l) in [ n: newLogger(l.0, withLevel: level(l.1)) ] }
Run Code Online (Sandbox Code Playgroud)

但是,这是返回一个[[String: XCGLogger]](看起来像一个字典数组给我).问题是如何返回扁平字典.当我尝试使用时,flatMap我开始围绕关于闭包的错误或者无法在类型上调用flatMap (Key, Value) -> NSDictionary.

Ren*_*nzo 8

原因是map只能返回数组,而不能返回字典.要获得字典,您有几种策略,例如:

var loggers : [String: XCGLogger] = [:]
dictionary.map{(n, l) in loggers[n] = newLogger(l.0, withLevel: level(l.1))}
Run Code Online (Sandbox Code Playgroud)

也许:

var loggers : [String: XCGLogger] = [:]
for (n, l) in dictionary {
  loggers[n] = newLogger(l.0, withLevel: level(l.1))
}
Run Code Online (Sandbox Code Playgroud)

记录仪


ois*_*sdk 5

extension SequenceType {
  func toDict<K : Hashable, V>
    (@noescape convert: Generator.Element -> (K, V)) -> [K:V] {
    var result: [K:V] = [:]
    for x in self {
      let (key, val) = convert(x)
      result[key] = val
    }
    return result
  }
}

dictionary.toDict { (n, l) in (n, newLogger(l.0, withLevel: level(l.1))) }
Run Code Online (Sandbox Code Playgroud)

要么

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

extension SequenceType {
  func toDict<K : Hashable, V>
    (@noescape convert: Generator.Element -> (K, V)) -> [K:V] {
    return Dictionary(lazy(self).map(convert))
  }
}

dictionary.toDict { (n, l) in (n, newLogger(l.0, withLevel: level(l.1))) }
Run Code Online (Sandbox Code Playgroud)

要么

extension Dictionary {
  func map<K : Hashable, V>(@noescape transform: (Key, Value) -> (K, V)) -> [K:V] {
    var result: [K:V] = [:]
    for x in self {
      let (key, val) = transform(x)
      result[key] = val
    }
    return result
  }
}

dictionary
  .map { (n, l) in (n, newLogger(l.0, withLevel: level(l.1))) }
Run Code Online (Sandbox Code Playgroud)