一尘不染

SwiftUI使用ForEach遍历字典

swift

有没有办法循环遍历Dictionary一个ForEach?Xcode说

通用结构’ForEach’要求’[String:Int]’符合’RandomAccessCollection’

所以有没有办法使Swift字典符合RandomAccessCollection,或者因为字典是无序的,那是不可能的吗?

我尝试过的一件事是迭代字典的键:

let dict: [String: Int] = ["test1": 1, "test2": 2, "test3": 3]
...
ForEach(dict.keys) {...}

keys不是Strings 的数组,而是类型Dictionary<String, Int>.Keys(不确定何时更改)。我知道我可以编写一个辅助函数,该函数接受字典并返回键的数组,然后可以迭代该数组,但是没有内置的方法或更优雅的方法吗?我可以扩展Dictionary并使其符合要求RandomAccessCollection吗?


阅读 1370

收藏
2020-07-07

共1个答案

一尘不染

简单的回答:不。

正如您正确指出的那样,字典是无序的。ForEach监视他的收藏中的更改。此更改包括插入,删除, 移动
和更新。如果发生任何这些更改,将触发更新。参考:https//developer.apple.com/videos/play/wwdc2019/204/
at 46:10:

ForEach自动监视其收藏夹中的更改

我建议你看说话:)

您不能使用ForEach,因为:

  1. 它观看收藏并监视动作。不可修改的字典无法使用。
  2. 当重用视图时(例如UITableView,可以回收单元的情况下重用单元,a List支持UITableViewCells,我认为a ForEach在做相同的事情),它需要计算要显示的单元。它通过查询数据源的索引路径来实现。从逻辑上讲,如果数据源是无序的,则索引路径是无用的。
2020-07-07