SwiftUI 使用 ForEach 遍历字典

标签 swift dictionary swiftui

有没有办法遍历 DictionaryForEach环形? Xcode 说

Generic struct 'ForEach' requires that '[String : Int]' conform to 'RandomAccessCollection'



那么有没有办法让 Swift Dictionaries 符合 RandomAccessCollection ,或者这是不可能的,因为字典是无序的?

我尝试过的一件事是迭代字典的键:
let dict: [String: Int] = ["test1": 1, "test2": 2, "test3": 3]
...
ForEach(dict.keys) {...}

但是keys不是 String 的数组s,它的类型是Dictionary<String, Int>.Keys (不确定何时更改)。我知道我可以编写一个辅助函数,它接受字典并返回一个键数组,然后我可以迭代该数组,但是没有内置的方法来做到这一点,或者更优雅的方法?我可以延长Dictionary并使其符合RandomAccessCollection或者其他的东西?

最佳答案

简单的回答:没有。
正如您正确指出的那样,字典是无序的。 ForEach 监视其集合的变化。这些更改包括插入、删除、移动 和更新。如果发生任何这些更改,将触发更新。引用:https://developer.apple.com/videos/play/wwdc2019/204/在 46:10:

A ForEach automatically watches for changes in his collection


我建议你看演讲:)
您不能使用 ForEach,因为:
  • 它观察一个系列并监控运动。不可能用一本无用的字典。
  • 当重用 View 时(如 UITableView 在单元格可以回收时重用单元格, ListUITableViewCells 支持,我认为 ForEach 正在做同样的事情),它需要计算要显示的单元格.它通过从数据源查询索引路径来实现。从逻辑上讲,如果数据源是无序的,那么索引路径是没有用的。
  • 关于SwiftUI 使用 ForEach 遍历字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56675532/

    相关文章:

    swift - 为什么我不能从方法更改对象属性

    ios - 如何在UIKit中更改 View ?

    ios - 无效的 Swift 支持/无效的 swift 实现

    python - 从 vars() 和 dict={} 创建的字典有什么区别?

    ios - 使用 Alamofire 解析 JSON 问题

    ios - StackView 中的几个标签最初被截断但在滚动时完美显示

    dictionary - 检查 map 是否是另一张 map 的子集

    ios - 如何合并 Framework SwiftUI

    swift - 如何将上下文菜单应用于 SwiftUI 列表行中的按钮?

    ios - 如何使用 SwiftUI 按钮打开本地 PDF 文件?