【问题标题】:Iterating Through a Dictionary in Swift在 Swift 中遍历字典
【发布时间】:2014-07-29 11:35:06
【问题描述】:

我对 Xcode 在 Swift 编程语言指南中给我的这个实验的答案有点困惑:

// Use a for-in to iterate through a dictionary (experiment)

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

我了解到,随着字典被横向转换,最大的数字被设置为变量 largest。但是,我很困惑为什么 Xcode 说 largest 被设置了 5 次、1 次或 3 次,具体取决于每个测试。

查看代码时,我发现仅在“Prime”中就应该设置 6 次(2、3、5、7、11、13)。然后它应该跳过“斐波那契”中的任何数字,因为这些数字都小于最大的,目前从“Prime”设置为 13。然后,它应该设置为 16,最后在“Square”中设置为 25,总共产生 8 次。

我是否遗漏了一些非常明显的东西?

【问题讨论】:

    标签: dictionary swift


    【解决方案1】:

    Swift(和其他语言)的字典没有顺序。当您遍历字典时,不能保证顺序将匹配初始化顺序。在这个例子中,Swift 先于其他键处理“Square”键。您可以通过在循环中添加打印语句来看到这一点。 25 是 Square 的第 5 个元素,因此对于 Square 中的 5 个元素,最大将设置为 5 倍,然后将保持在 25。

    let interestingNumbers = [
        "Prime": [2, 3, 5, 7, 11, 13],
        "Fibonacci": [1, 1, 2, 3, 5, 8],
        "Square": [1, 4, 9, 16, 25]
    ]
    var largest = 0
    for (kind, numbers) in interestingNumbers {
        println("kind: \(kind)")
        for number in numbers {
            if number > largest {
                largest = number
            }
        }
    }
    largest
    

    打印出来:

    kind: Square
    kind: Prime
    kind: Fibonacci
    

    【讨论】:

    • 非常感谢!我被难住了一会儿。我一直在为每个键添加和删除数字,希望能够剖析它,但我没有得到任何结果。非常感谢您的解释!
    • dict.forEach { key, value in }
    【解决方案2】:
    let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
    dict.forEach { print($0) }
    

    结果是

    ("名字", "Maninder") (“姓氏”,“辛格”) (“地址”、“昌迪加尔”)

    【讨论】:

    • 你能告诉我这个例子在 1000 个数据循环中是否更有效?因为我有一个那么大的 JSON,所以最后需要 1GB 的处理。较新的设备不会崩溃,但在我的 iphone 5s 16GB 中会崩溃一半。
    • 这似乎有点误导,因为最初的问题是关于字典是否保持它们的顺序,然后你发布一个例子,当它们不保持它们的顺序时。
    【解决方案3】:

    这是一个用户定义的遍历字典的函数:

    func findDic(dict: [String: String]) {
        for (key, value) in dict {
            print("\(key) : \(value)")
        }
    }
    
    findDic(dict: ["Animal": "Lion", "Bird": "Sparrow"])
    // prints…
    // Animal : Lion 
    // Bird : Sparrow
    

    【讨论】:

      【解决方案4】:

      这是该实验的替代方案(Swift 3.0)。这会准确告诉您哪种数字最大。

      let interestingNumbers = [
      "Prime": [2, 3, 5, 7, 11, 13],
      "Fibonacci": [1, 1, 2, 3, 5, 8],
      "Square": [1, 4, 9, 16, 25],
      ]
      
      var largest = 0
      var whichKind: String? = nil
      
      for (kind, numbers) in interestingNumbers {
          for number in numbers {
          if number > largest {
              whichKind = kind
              largest = number
          }
        }
      }
      
      print(whichKind)
      print(largest)
      
      OUTPUT:
      Optional("Square")
      25
      

      【讨论】:

        【解决方案5】:

        如果你想遍历所有的值:

        dict.values.forEach { value in
            // print(value)
        }
        

        【讨论】:

        • 我非常讨厌这个事实,这是正确的。在愚蠢的 Joda 中,每个人都必须与 swift 的创造者交谈! ?
        【解决方案6】:

        您还可以使用values.makeIterator() 来迭代dict 值,如下所示:

        for sb in sbItems.values.makeIterator(){
          // do something with your sb item..
          print(sb)
        }
        

        您也可以像这样以更快速的方式进行迭代:

        sbItems.values.makeIterator().forEach{
          // $0 is your dict value..
          print($0) 
        }
        

        sbItems[String : NSManagedObject] 类型的字典

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-19
          • 2014-07-31
          • 2016-10-25
          • 2018-11-02
          • 1970-01-01
          • 2019-09-24
          相关资源
          最近更新 更多