Swift等同于`[NSDictionary initWithObjects:forKeys:]`

ork*_*den 8 dictionary objective-c nsdictionary ios 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];
Run Code Online (Sandbox Code Playgroud)

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

let keys = ["one", "two", "three"]
let values = [1, 2, 3]
// ???
let dict: [String:Int] = ["one":1, "two":2, "three":3] // expected result
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 7

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

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]
Run Code Online (Sandbox Code Playgroud)

这假定所有键都不同,否则它将因运行时异常而中止.

如果不保证密钥是不同的,那么你可以这样做

let keys = ["one", "two", "one"]
let values = [1, 2, 3]

let dict = Dictionary(zip(keys, values), uniquingKeysWith: { $1 })

print(dict) // ["one": 3, "two": 2]
Run Code Online (Sandbox Code Playgroud)

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


Udi*_*itS 5

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

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

  • 请注意,使用这种方法,你的`dict`将是`NSDictionary`类型而不是`[String:Int]`.你可以强制转发到`[String:Int]`这样:`NSDictionary.init(objects:values,forKeys:keys)as![String:Int]` (2认同)
  • 啊,我现在明白你的要求了.@JAL的答案将适合这一点. (2认同)