swift中的不可变字典初始化

时间:2016-04-19 17:41:19

标签: swift

我想从结构数组中创建一个不可变的字典。有没有办法在语言中直接执行此操作?我知道它可以通过临时可变字典来完成。

class Foo {
    let key: Int
// ... other stuff
    init(key:Int){ self.key = key }
}

let listOfFoos : [Foo] = []

var dict = [Int:Foo]()
for foo in listOfFoos { dict[foo.key] = foo }
let immutableDict = dict

或使用NSDictionary,如果Foo是一个对象

let immutableDict2 : [Int:Foo] = NSDictionary(objects:listOfFoos, forKeys: listOfFoos.map{$0.key}) as! [Int:Foo]

1 个答案:

答案 0 :(得分:2)

虽然Swift目前没有构建绕过可变字典的字典的功能,但你可以在没有循环的闭包中完成它,如下所示:

static let listOfFoos : [Foo] = [Foo(1), Foo(2), Foo(3)]

static let dict = { () -> [Int:Foo] in
    var res = [Int:Foo]()
    listOfFoos.forEach({foo in res[foo.key] = foo})
    return res
}()

这种语法有点棘手,所以这里有一个简短的解释:

  • () -> [Int:Foo] { ... }创建一个无参数的闭包,生成字典[Int:Foo]
  • var res = [Int:Foo]()创建一个可变字典,稍后将其分配给不可变变量dict
  • listOfFoos.forEach({foo in res[foo.key] = foo})取代您的for循环
  • 关闭花括号后,
  • ()立即调用闭包,在初始化时生成结果。