【问题标题】:Swift equivalent to NSDictionary initWithObjects:ForKeys [duplicate]Swift 等效于 NSDictionary initWithObjects:ForKeys [重复]
【发布时间】:2017-07-23 15:35:27
【问题描述】:
 NSArray *keys = @[@"one", @"two", @"three"];
 NSArray *values = @[@1, @2, @3];
 NSDictionary *dict = [[NSDictionary alloc] initWithObjects: values forKeys: keys];
 if user.isEligible() {
    [dict setObject:@"Hi" forKey:@"Eligible"];
 }

我已经看到here 给出的答案,但这不是我想要的

我需要在 Swift 中存储 Dictionary 而不是 NSDictionary,并且我需要 initWithObjects:forKeys 函数的精确翻译

我希望这个dict 是可变的,这样我就可以像在if-condition 中添加对象一样向它添加对象。

【问题讨论】:

    标签: ios swift dictionary nsdictionary


    【解决方案1】:

    您可以在 extension 广告中创建您的便利初始化程序,使用:

    for (key, value) in zip(keys, values) {
            self[key] = value
    }
    

    zip函数基本返回:

    元组对的序列,其中每对的元素是 sequence1和sequence2的对应元素。

    【讨论】:

      【解决方案2】:

      Swift 字面量字典语法如下:

      var dict: [String: Int] = ["one": 1, "two": 2, "three": 3]
      

      【讨论】:

      • 这是手动一一分配。无论如何分配键数组和值数组?
      • 我误会了,对不起。我想你链接到的答案给出了答案。什么不适合您的情况?
      【解决方案3】:

      在 Swift 中没有文字等价物。

      您可以创建一个NSDictionary 并将其转换为 Swift Dictionaryvar 关键字使其可变。

      let keys = ["one", "two", "three"]
      let values = [1, 2, 3]
      var dict = NSDictionary(objects: values, forKeys: keys as [NSCopying]) as! [String:Any]
      
      if user.isEligible() {
          dict["Eligible"] = "Hi"
      }
      

      但是由于键和对象无论如何都是用文字创建的,所以我推荐使用原生语法

      var dict : [String:Any] = ["one" : 1, "two" : 2, "three : 3]
      

      只有在添加Int等其他类型时才需要显式注解[String:Any]

      【讨论】:

        【解决方案4】:

        另一种选择是为 Swift 的 Dictionary 类型添加一个扩展,以添加一个方便的初始化器,该初始化器接受一个键数组和一个值数组。

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

        测试一下:

        let keys1 = [1, 2, 3, 4, 5]
        let values1 = ["a", "b", "c", "d", "e"]
        var resultDict1 : [Int: String] = Dictionary(keys: keys1, values: values1)
        // Result [5 : "e", 2: "b", 1: "a", 3: "c", 4: "d"]
        

        通过在内部使用zip,初始化程序可以处理keysvalues 数组的长度可能不匹配的事实:

        let keys2 = [1, 2, 3, 4, 5, 6]
        let values2 = ["a", "b", "c", "d", "e"]
        var resultDict2 : [Int: String] = Dictionary(keys: keys, values: values)
        // Result [5 : "e", 2: "b", 1: "a", 3: "c", 4: "d"]
        

        【讨论】:

          【解决方案5】:

          由于 swift typeSafe 语言,您也可以这样使用..

          let param = ["key1" : "value1",
                       "key2" : "value2",
                       "key2" : "value3"]
          

          如果你想要同样的,你可以让你的函数像这样..

          let keys = [1,2,3,4]
          let values = [10, 20, 30, 40]
          
          var dict:[Int:Int] = [:]
          keys.enumerate().forEach { (i) -> () in
              dict[i.element] = values[i.index]
          }
          print(dict) // [2: 20, 3: 30, 1: 10, 4: 40]
          

          通用

          func foo<T:Hashable,U>(keys: Array<T>, values: Array<U>)->[T:U]? {
              guard keys.count == values.count else { 
                 return nil 
              }
              var dict:[T:U] = [:]
              keys.enumerate().forEach { (i) -> () in
                  dict[i.element] = values[i.index]
              }
              return dict
          }
          
          let d = foo(["x","y"],values:[1,2])    // ["x": 2, "y": 1]
          let dn = foo(["a","b"],values:[1,2,3]) // nil
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-13
            • 2018-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-20
            • 2013-10-07
            相关资源
            最近更新 更多