有没有办法在ForEach循环中遍历Dictionary?Xcode说

泛型 struct "ForEach"要求"[String:Int]"符合"RandomAccessCollection"

那么,有没有办法让Swift字典符合RandomAccessCollection的要求,或者因为字典无序而无法做到这一点?

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

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

但是keys不是String的数组,它的类型是Dictionary<String, Int>.Keys(不确定是什么时候改变的).我知道我可以编写一个helper函数,它接收一个字典并返回一个键数组,然后我可以迭代该数组,但这不是一种内置的方法,或者一种更优雅的方法吗?我能把Dictionary号延长到RandomAccessCollection号吗?

推荐答案

答案很简单:不.

正如你正确指出的,字典是无序的.ForEach手表系列的变化.这些更改包括插入、删除和更新.如果发生任何这些更改,将触发更新.参考:46:10时https://developer.apple.com/videos/play/wwdc2019/204/分:

ForEach会自动监视Collection 中的变化

我建议你看演讲:)

您不能使用ForEach,因为:

  1. 它监视一个集合并监视运动.用一本未翻阅的字典是不可能的.
  2. 当重用视图时(比如当单元可以回收时,UITableView重用单元,List支持UITableViewCells,我认为ForEach也在做同样的事情),它需要计算要显示的单元.它通过从数据源查询索引路径来实现这一点.从逻辑上讲,如果数据源无序,索引路径是无用的.

Swift相关问答推荐

如何在Swift 中创建移动的uil标签?

我正在try 通过代码设置节中页眉和页脚的高度,但它不起作用

同时具有每个文本的标识符的文本组的可扩展性标识符

try 从闭包访问返回的字符串时出现无法将类型 '()' 的返回表达式转换为返回类型 'String'编译器错误

如何让默认函数参数引用另一个函数参数?

如何让飞机与 RealityKit 中的物体相撞

在主要参与者中启动分离任务和调用非隔离函数之间的区别

签署GoogleSignIn-GoogleSignIn需要开发团队

如何更改任务栏 colored颜色 和 sf 符号 colored颜色 ?

使用协议捕获 SwiftUI 视图

Swift:withCheckedContinuation 和 Dispatch QoSClass

SwiftUI 4 列表初始化程序在 iOS 中不可用

如何删除标签和步进按钮之间的间距是 SwiftUI Stepper?

我如何从 UIAlertController 导航到新屏幕(swiftUI)

如何让 SwiftUI 中的文本在旋转框架的同时侧向显示?

获取 SwiftUI 中 Binding 的值更改更新

Swift中的分段错误

EXC_BREAKPOINT 崩溃的原因范围

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

枚举大小写的原始值必须是文字