答案 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)] ?? "-")
}
//...