Swift等效于[NSDictionary initWithObjects:forKeys:]

发布于 2021-01-31 23:51:48

是否有斯威夫特的本地等效Dictionary[NSDictionary initWithObjects: forKeys:]

假设我有两个包含键和值的数组,并想将它们放入字典中。在Objective-C中,我会这样做:

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

当然,我可以遍历两个数组的计数器,使用a 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
关注者
0
被浏览
77
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    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]
    

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

    如果不能保证键是唯一的,则可以

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看