我想从结构数组中创建一个不可变的字典。有没有办法在语言中直接执行此操作?我知道它可以通过临时可变字典来完成。
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]
答案 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
循环()
立即调用闭包,在初始化时生成结果。