首页 > 解决方案 > 在 Swift 中迭代字典

问题描述

我正在尝试遍历这本字典

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 largestName: String?

for (names, numbers) in interestingNumbers {
    for number in numbers {
        for name in names {
            if number > largest {
                largest = number
                largestName = interestingNumbers(forKey: largest)
            }
        }

    }
}
print(largest)
print(largestName)

但我收到这种类型的错误:error: cannot call value of non-function type '[String : [Int]]'

我不知道我在哪里错过了正确的迭代。任何帮助请。谢谢

标签: iosswiftdictionary

解决方案


您的代码有几个问题。

首先,您有一个额外的循环 -for name in names遍历Dictionary键的每个字符。最外层for ... in interestingNumbers已经返回了字典的键值对。

您只需遍历numbers查找每个数组的最大元素,然后将正确的数字和键 ( name) 分配给您的变量。

for (name, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
            largestName = name
        }
    }
}

但是,最好使用函数式编程,首先使用 找到每个数组compactMap的最大值,然后使用 找到每个键值对的最大值max(by:)

let largestNumbers = interestingNumbers.compactMap { pair -> (String, Int)? in
    guard let max = pair.value.max() else { return nil }
    return (pair.key, max)
}
let largest = largestNumbers.max(by: { $0.1 < $1.1 })

largest // ("Square", 25)

推荐阅读