【问题标题】:SwiftUI - Shape causes reverse array accessSwiftUI - 形状导致反向数组访问
【发布时间】:2026-01-06 12:45:02
【问题描述】:

试图理解为什么在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 的大部分内部行为都是一个谜。它是封闭源代码,所以我们几乎只能猜测。

标签: 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

【讨论】: