SwiftUI:为什么 ForEach 需要 ID?

D.D*_*.D. 14 swiftui

我在 SwiftUI 视图中使用 ForEach 循环,并且收到奇怪的警告。

它工作得很好,像这样:

ForEach(0..<7) { i in
    // do something
}
Run Code Online (Sandbox Code Playgroud)

然后我将 7 更改为常数:

let numberOfElements = 7
ForEach(0..<numberOfElements) { i in
    // do something
}
Run Code Online (Sandbox Code Playgroud)

并收到以下警告:

非常量范围:参数必须是整数字面量

我用谷歌搜索发现以下有效的解决方案:

let numberOfElements = 7
ForEach(0..<numberOfElements, id:\.self) { i in
    // do something
}
Run Code Online (Sandbox Code Playgroud)

但是,我不知道它为什么有效。为什么我必须为 ForEach 循环提供一个 ID,该 ID 有何用途?

小智 4

ForEach(0..<numberOfElements) { i in
    // do something
}
Run Code Online (Sandbox Code Playgroud)

使用上面的 init 会弹出使用文字值警告的原因ForEach是因为 SwiftUI 不希望在使用 init 方法时重新渲染任何内容Range<Int>这是已记录的要求/功能。例外是带有id:.

idSwiftUI 以及许多其他基于视图树的框架(如 React)中的可哈希问题是因为这些 UI 框架需要使用这些id来跟踪“ForEach容器视图”或任何其他“容器视图”内视图的更新,以帮助框架实现可用性能。如果您想深入了解,请观看以下WWDC 视频:Demystify SwiftUI