ChatGPT解决这个技术问题 Extra ChatGPT

在 Swift 中遍历字典

我对 Xcode 在 Swift Programming Language Guide 中给我的这个实验的答案有点困惑:

// 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 次。

我错过了一些完全明显的东西吗?


r
rmtheis

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

这打印:

种类:正方形种类:素数种类:斐波那契


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

结果将是

("FirstName", "Maninder") ("LastName", "Singh") ("Address", "Chandigarh")


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

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

func findDic(dict: [String: String]) {
    for (key, value) in dict {
        print("\(key) : \(value)")
    }
}

findDic(dict: ["Animal": "Lion", "Bird": "Sparrow"])
// prints…
// Animal : Lion 
// Bird : Sparrow

j
jabbyApps

这是该实验的替代方案(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

n
norbDEV

如果要遍历所有值:

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

我非常讨厌这个事实,这是正确的。在愚蠢的 Joda 中,每个人都必须与 swift 的创造者交谈! 🤮
a
aturan23

您还可以使用 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] 类型的字典