无法将“Int”类型的值转换为预期的参数类型“Dictionary.Index”

问题描述

我在第 8 和 9 行收到错误“无法将类型 'Int' 的值转换为预期的参数类型 'Dictionary.Index'”(“let k”和“for y in”)

var namesDictionary = [String: [classObject]]()

func checkFavoriteCount(table:UITableView)
{
    favArray.removeAll()
    for x in (0...namesDictionary.keys.count - 1)
    {
        let k = namesDictionary[x].key
        for y in (0...namesDictionary[x].value.count - 1)
        {
            if (namesDictionary[k]?[y].isFav ?? false)
            {
                favArray.append((namesDictionary[k]?[y])!)
            }
        }
    }
    tableView.reloadData()
}

解决方法

并非 Swift 中的每个集合都由 Int 索引。在迭代集合时,您应该始终使用集合索引。请注意,在 Swift 中使用单个字母来表示变量不是一个好习惯,除非您使用 (x,y) 之类的东西作为坐标:

func checkFavoriteCount(table: UITableView) {
    favArray.removeAll()
    for index in namesDictionary.indices {
        let key = namesDictionary[index].key
        for valueIndex in namesDictionary[index].value.indices {
            if let object = namesDictionary[key]?[valueIndex],object.isFav {
                favArray.append(object)
            }
        }
    }
}

或者简单地使用高阶方法:

func checkFavoriteCount(table: UITableView) {
    favArray = namesDictionary.flatMap(\.value).filter(\.isFav)
    // or filtering while flattening
    // favArray = namesDictionary.flatMap { $0.value.filter(\.isFav) }
}