SwiftUI网格索引超出范围

时间:2020-01-07 17:26:51

标签: swift swiftui swift5.2

我尝试this solution使用网格布局。

我们想在网格中动态显示数组项,如果Array.count Changed出现索引超出范围的错误,则应用崩溃。

该如何解决?

clear()

3 个答案:

答案 0 :(得分:2)

避免任何indexOutOfBounds的一种简单方法是在执行操作之前检查索引是否超出范围...

因此进行更改:

ForEach(0..<self.cols,id:\.self) { column in
    let card = self.colrow(col: column, row: row)
    if (card < self.cards.count) {
        Text(self.cards[card])
    }
}

这将使您的最后一行有空,但不会崩溃

答案 1 :(得分:0)

cols返回4或2的方式,您必须在count中获得偶数cards

我将通过始终检查count中的cards并在结尾处添加一个空项目来解决此问题。

示例:

//only even numbers count
var cards = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"]

if (cards.count % 2) != 0 {
    cards.add("")
}

答案 2 :(得分:0)

如果添加自定义安全下标,则可以使用nil合并用任何您喜欢的索引替换boudns数组元素。

extension Array {
   subscript(guarded idx: Int) -> Element? {
        guard (startIndex..<endIndex).contains(idx) else { return nil }
        return self[idx]
    }
}

然后,您可以像这样重写Text视图以显示无效索引的连字符,并且不会崩溃。

//...
ForEach(0..<self.cols,id:\.self) { column in
                        Text(self.cards[guarded: self.colrow(col: column, row: row)] ?? "-")
                    }
//...