我怎样才能将两个数组合并成一个字典?

我有2个数组:

var identic = [String]() var linef = [String]() 

我已经附加了他们的数据。 现在为了可用性目的,我的目标是将它们全部结合成具有以下结构的字典

 FullStack = ["identic 1st value":"linef first value", "identic 2nd value":"linef 2nd value"] 

我一直在浏览networking,并没有find一个可行的解决scheme。

任何想法,不胜感激。

谢谢!

这听起来像.enumerated()

 var arrayOne: [String] = [] var arrayTwo: [String] = [] var dictionary: [String: String] = [:] for (index, element) in arrayOne.enumerated() { dictionary[element] = arrayTwo[index] } 

但是,如果您需要专业方法,请使用扩展名:

 extension Dictionary { public init(keys: [Key], values: [Value]) { precondition(keys.count == values.count) self.init() for (index, key) in keys.enumerate() { self[key] = values[index] } } } 

编辑: enumerate()enumerated() (Swift 3→Swift 4)

一个稍微不同的方法,它不需要数组的长度相同,因为zip函数将安全地处理该数组。

 extension Dictionary { init(keys: [Key], values: [Value]) { self.init() for (key, value) in zip(keys, values) { self[key] = value } } } 

如果你想要更安全,并确保每次select较小的数组(如果第二个数组小于第一个数组,则不会发生崩溃),请执行以下操作:

 var identic = ["A", "B", "C", "D"] var linef = ["1", "2", "3"] var Fullstack = [String: String]() for i in 0..<min(linef.count, identic.count) { Fullstack[identic[i]] = linef[i] } print(Fullstack) // "[A: 1, B: 2, C: 3]" 

这是一个通用的解决scheme

 func dictionaryFromKeysAndValues<K : Hashable, V>(keys:[K], values:[V]) -> Dictionary<K, V> { assert((count(keys) == count(values)), "number of elements odd") var result = Dictionary<K, V>() for i in 0..<count(keys) { result[keys[i]] = values[i] } return result } var identic = ["identic 1st value", "identic 2nd value", "identic 3rd value"] var linef = ["linef 1st value", "linef 2nd value", "linef 3rd value"] let mergedDictionary = dictionaryFromKeysAndValues(identic, linef) 

从Xcode 9.0开始,你可以简单地做:

 var identic = [String]() var linef = [String]() // Add data... let fullStack = Dictionary(uniqueKeysWithValues: zip(identic, linef)) 

如果您的密钥不能保证是唯一的,请改用它:

 let fullStack = Dictionary(zip(identic, linef), uniquingKeysWith: { (first, _) in first }) 

要么

 let fullStack = Dictionary(zip(identic, linef), uniquingKeysWith: { (_, last) in last }) 

文档:

这是一个扩展,它结合了以前的一些答案,接受所有的序列,而不仅仅是数组。

 public extension Dictionary { init<K: Sequence, V: Sequence>(keys: K, values: V) where K.Element == Key, V.Element == Value, K.Element: Hashable { self.init() for (key, value) in zip(keys, values) { self[key] = value } } } 

该扩展不需要序列长度相同。 如果你想要,这是一个断言的扩展。

 public extension Dictionary { init<K: Sequence, V: Sequence>(keys: K, values: V) where K.Element == Key, V.Element == Value, K.Element: Hashable { self.init() var keyIterator = keys.makeIterator() for value in values { let key = keyIterator.next() assert(key != nil, "The value sequence was longer.") self[key!] = value } assert(keyIterator.next() == nil, "The key sequence was longer.") } }