SwiftUI - 形状导致反向数组访问

Posted

技术标签:

【中文标题】SwiftUI - 形状导致反向数组访问【英文标题】:SwiftUI - Shape causes reverse array access 【发布时间】:2021-07-08 21:38:23 【问题描述】:

试图理解为什么在ForEach 中使用Shape 会导致数组的反向迭代。示例:

var body: some View 
   ForEach(0...10,id:\.self)  index in
      TestShape()
   


struct TestShape:Shape 
    func path(in rect: CGRect) -> Path 
        return Path()
    

如果您每次通过都检查index,它将从 10 开始并向后工作。但是,如果不是调用TestShape,而是说Text("test"),则索引将从0 开始并逐渐上升。所以这里的关键区别在于对形状的调用。为什么会这样?

【问题讨论】:

“如果你每次都检查索引”你是如何检查它的? 断点或打印语句。 嗯,不用担心这个,让ForEach自己做吧。它的循环顺序不应该影响你的代码(如果是这样,你可能做错了什么) 谢谢,但这不是我的问题。我的问题是寻求理解这种行为。 好吧,但无论如何,SwiftUI 的大部分内部行为都是一个谜。它是封闭源代码,所以我们几乎只能猜测。 【参考方案1】:

这是我用来证明索引没有反转的测试:

import SwiftUI

@main
struct TestApp: App 
    var body: some Scene 
        WindowGroup 
            ContentView()
        
    


 struct TestShape:Shape 
     func path(in rect: CGRect) -> Path 
         return Path()
     
 

struct ContentView: View 
    var body: some View 
        ForEach(0...10,id:\.self)  index in
           let _ = print("---> index: \(index)")
           TestShape()
        
    

输出是:

--->索引:0

---> 索引:1

---> 索引:2

---> 索引:3

---> 索引:4

---> 索引:5

---> 索引:6

---> 索引:7

---> 索引:8

--->索引:9

---> 索引:10

【讨论】:

以上是关于SwiftUI - 形状导致反向数组访问的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI ListView 没有访问 ForEach 循环

检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)

不应发生的 Swift 内存冲突

如何修改拖放预览SwiftUI的背景颜色和形状?

调用数组中的初始化程序没有完全匹配(Swift/SwiftUI)

如何在 swift ui 中调整形状以适应文本视图的长度和宽度