Swift相当于“

有什么相当于Swift的本地Dictionary [NSDictionary initWithObjects: forKeys:]

说我有两个键和值的数组,并希望把它们放在一个字典中。 在Objective-C中,我会这样做:

 NSArray *keys = @[@"one", @"two", @"three"]; NSArray *values = @[@1, @2, @3]; NSDictionary *dict = [[NSDictionary alloc] initWithObjects: values forKeys: keys]; 

当然,我可以通过这两个数组迭代计数器,使用var dict: [String:Int]并添加一步一步的东西。 但是,这似乎不是一个好的解决scheme。 使用zipenumerate可能是更好的同时迭代两种方法。 然而这种方法意味着有一个可变的字典,而不是一个不可变的字典。

 let keys = ["one", "two", "three"] let values = [1, 2, 3] // ??? let dict: [String:Int] = ["one":1, "two":2, "three":3] // expected result 

一个class轮,使用zipreduce

 let dict = zip(keys, values).reduce([String:Int]()){ var d = $0; d[$1.0] = $1.1; return d } 

您可以通过为Dictionarytuple定义+运算符来缩短reduceexpression式:

 func +<K,V>(lhs: [K:V], rhs: (K, V)) -> [K:V] { var result = lhs result[rhs.0] = rhs.1 return result } let dict = zip(keys, values).reduce([String:Int](), combine: +) 

你可以简单地使用initWithObjects:forKeys:的Swift等价物initWithObjects:forKeys:

 let keys = ["one", "two", "three"] let values = [1, 2, 3] var dict = NSDictionary.init(objects: values, forKeys: keys) 

使用结构工作纯Swift解决scheme。 使用zip作为元组遍历你的两个数组,然后为元组中的每个键(值)创build一个字典。

 struct SomeStruct { var someVal: Int? } var keys = [String]() var values = [SomeStruct]() for index in 0...5 { keys.append(String(index)) values.append(SomeStruct(someVal: index)) } var dict = [String : Any]() for (key, value) in zip(keys, values) { dict[key] = value } print(dict) // "["4": SomeStruct(someVal: Optional(4)), "2": SomeStruct(someVal: Optional(2)), "1": SomeStruct(someVal: Optional(1)), "5": SomeStruct(someVal: Optional(5)), "0": SomeStruct(someVal: Optional(0)), "3": SomeStruct(someVal: Optional(3))]" 

你也可以在zip上使用forEach

 var dict = [String : Any]() zip(keys, values).forEach { dict[$0.0] = $0.1 } print(dict) // "["4": SomeStruct(someVal: Optional(4)), "2": SomeStruct(someVal: Optional(2)), "1": SomeStruct(someVal: Optional(1)), "5": SomeStruct(someVal: Optional(5)), "0": SomeStruct(someVal: Optional(0)), "3": SomeStruct(someVal: Optional(3))]\n" 
 let keys = ["one", "two", "three"] let values = [1, 2, 3] func createDict<K:Hashable,V>(keys: [K], values:[V])->[K:V] { var dict: [K:V] = [:] // add validity checks here by yourself ! // and return early, or throw an error ... keys.enumerate().forEach { (index,element) -> () in dict[element] = values[index] } return dict } let dict = createDict(keys, values: values) // ["one": 1, "three": 3, "two": 2] let dict2:[Int:Any] = createDict([1,2,3,4,5], values: [true,"two",3.4,5,[1,2,3]]) // [5: [1, 2, 3], 2: "two", 3: 3.4, 1: true, 4: 5] 

与zip解决scheme相比有什么区别? 很难说…对我来说,ziptypes的注释是最大的问题

 let a:Zip2Sequence<[Int],[Any]> = zip([1,2,3,4,5], [true,"two",3.4,5,[1,2,3]]) var d:[Int:Any] = [:] a.forEach { (key, value) -> () in d[key] = value } print(d) // [5: [1, 2, 3], 2: "two", 3: 3.4, 1: true, 4: 5] 

但枚举解决scheme也有点快

Swift 4开始,您可以直接从一系列键/值对创build字典:

 let keys = ["one", "two", "three"] let values = [1, 2, 3] let dict = Dictionary(uniqueKeysWithValues: zip(keys, values)) print(dict) // ["one": 1, "three": 3, "two": 2] 

这假定所有的键都不一样,否则它会以运行时exception中止。

如果钥匙不能保证是不同的,那么你可以做

 let keys = ["one", "two", "one"] let values = [1, 2, 3] let dict = Dictionary(zip(keys, values), uniquingKeysWith: { $1 }) print(dict) // ["one": 3, "two": 2] 

第二个参数是一个闭包,它确定在重复键的情况下哪个值“获胜”。