【问题标题】:How do I get the index of an item inside of a ForEach loop?如何在 ForEach 循环中获取项目的索引?
【发布时间】:2020-02-25 04:41:47
【问题描述】:

我有一个正在循环的数组数组。该数组的结构代表一年中的 4 个季度:

Q0 一月、二月、三月
第一季度 4 月、5 月、6 月
第 2 季度 7 月、8 月、9 月
10 月第 3 季度,11 月 12 月

@State var quarters: [[Month]] = [[.init(name: "January"),.init(name: "February"),.init(name: "March")],
                               [.init(name: "April"), .init(name: "May"), .init(name: "June")],
                               [.init(name: "July"),.init(name: "August"),.init(name: "September")],
                               [.init(name: "October"), .init(name: "November"), .init(name: "December")]]

在下面的 HStack 中,我尝试附加 quarter 的索引,以便最终得到 Q0、Q1、Q2、Q3

VStack {

    ForEach (self.quarters, id: \.self) { quarter in
        VStack {
        Spacer()
            HStack {

                Text("Q\(quarter.index)")
                .font(.system(size: 40, weight: .black, design: .rounded))

            }
        }
    }
}

这不起作用。有没有办法可以在这里获取我的 ForEach 循环数组中的数组索引?我知道如果 ForEach 循环使用范围作为其数据集,则有一种方法可以检索索引,但如果数据集是数组,则我不会。

【问题讨论】:

  • @JoakimDanielson 这个答案有效,因为 ForEach 循环的数据集是一个范围,而不是一个数组。它实际上并不检索数组的索引。
  • @JoakimDanielson 是的,但我需要访问 self.quarters 中的对象,而不仅仅是范围。如果我使用 self.quarters.indices 只会给我一个范围,而不是访问 self.quarters 的对象,对吗?
  • 哦,别管我以前的cmets了。我完全错过了你有一个数组数组。难怪我们互相交谈。对不起。
  • 我仍然没有真正支持你想要做什么,是为quarters 数组中的每个子数组输出 Q1、Q2、Q3、Q4,还是你想访问其中的某些内容子数组(即 Month 实例)?
  • @JoakimDanielson 请参阅编辑。

标签: ios arrays swift foreach swiftui


【解决方案1】:

你可以这样使用枚举数组:

   struct TempView: View{

   @State var quarters: [[Month]] = [[.init(name: "January", products: ["1", "2"]),.init(name: "February", products: ["1", "2"]),.init(name: "March", products: ["1", "2"])],
[.init(name: "April", products: ["1", "2"]), .init(name: "May", products: ["1", "2"]), .init(name: "June", products: ["1", "2"])]]

  var body: some View {

        ForEach (self.quarters.indices , id: \.self) { (index) in

        VStack {
        Spacer()
            HStack {
                Text("Q\(index)")
                .font(.system(size: 40, weight: .black, design: .rounded))
                Button("TestButton",action: {
                    self.quarters.append([.init(name: "January", products: ["1", "2"]),.init(name: "February", products: ["1", "2"]),.init(name: "March", products: ["1", "2"])])
                })
            }
             Spacer()
        }
    }

 }}                                                                                                

【讨论】:

  • 这主要是可行的,但我最终得到了 Q0、Q1、Q2、Q3 的 4 次迭代,而不是 1 次。
  • 我试图代表一年中的 4 个季度。 Q0 = [一月、二月、三月] Q1 = [四月、五月、六月] Q2 = [七月、八月、九月] Q3 = [十月、十一月、十二月]
  • self.quarters 中,应该是 4 like = [[],[],[],[]]。所以你会得到4个季度。但在当前数据中:只有两个 = [[],.[] ],所以你只会看到两个季度。只需添加更多数组即可 4. 您看到的取决于您提供的数据,而不是 UI。
  • 请参阅编辑。我编辑之前的代码只是为了证明概念。我的更新代表了正确的数据集,但我遇到了与我提到的相同的问题。
  • 如果第二个 ForEach 循环被删除,你的答案似乎对我产生了正确的结果:)
【解决方案2】:

解决这个问题的一种方法是查找数组中元素的位置

Text("Q\(self.quarters.firstIndex(of: quarter)!)")

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2010-11-29
    • 2013-09-20
    • 2013-07-18
    • 2015-05-03
    相关资源
    最近更新 更多