You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何用ForEach遍历数组奇偶索引实现两列按钮布局

解决SwiftUI两列多行按钮布局问题

你的问题出在两个VStack都完整遍历了game.ButtonAnswers数组,导致每个按钮重复显示。要实现左列放第1、3、5…个元素(对应偶数索引0、2、4…),右列放第2、4、6…个元素(对应奇数索引1、3、5…),可以用以下两种方法修复:

方法一:在ForEach中过滤索引

直接在遍历的时候结合索引判断,只渲染对应列的元素:

HStack {
    VStack {
        // 左列:偶数索引元素(第1、3、5…个)
        ForEach(Array(game.ButtonAnswers.enumerated()), id: \.element.id) { index, answer in
            if index % 2 == 0 {
                ButtonRows(answer: answer)
                    .environmentObject(game)
            }
        }
    }
    VStack {
        // 右列:奇数索引元素(第2、4、6…个)
        ForEach(Array(game.ButtonAnswers.enumerated()), id: \.element.id) { index, answer in
            if index % 2 == 1 {
                ButtonRows(answer: answer)
                    .environmentObject(game)
            }
        }
    }
}

通过enumerated()同时获取元素的索引和值,用index % 2判断奇偶性,只保留对应列的元素。

方法二:提前拆分数组(更高效)

先把原数组拆成左右两个子数组,再分别遍历,避免重复遍历原数组:

// 先在视图里定义计算属性,拆分数组
private var leftColumnAnswers: [YourAnswerType] {
    game.ButtonAnswers.enumerated()
        .filter { $0.offset % 2 == 0 }
        .map { $0.element }
}

private var rightColumnAnswers: [YourAnswerType] {
    game.ButtonAnswers.enumerated()
        .filter { $0.offset % 2 == 1 }
        .map { $0.element }
}

// 然后在布局中使用
HStack {
    VStack {
        ForEach(leftColumnAnswers, id: \.id) { answer in
            ButtonRows(answer: answer)
                .environmentObject(game)
        }
    }
    VStack {
        ForEach(rightColumnAnswers, id: \.id) { answer in
            ButtonRows(answer: answer)
                .environmentObject(game)
        }
    }
}

注意把YourAnswerType替换成你实际的数组元素类型,这种方式性能更优,代码结构也更清晰。

内容的提问来源于stack exchange,提问作者TrappinNachos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:46:04