В моей модели я создаю массив объектов:
let myObjects = [ theObject(name: "first", ...),
theObject(name: "second", ...), etc.
Я хочу использовать представление контейнера SwiftUI Grid
для отображения содержимого объектов в макете с двумя столбцами. Но структура GridRow
обращается к массиву более одного раза за проход, что усложняет задачу ForEach
:
GridRow {
Text(myObjects[i].name)
Text(myObjects[i+1].name)
}
GridRow {
... etc
Я не уверен, как лучше всего перебирать эти объекты. Вот три идеи:
1. Не используйте Grid
Я мог бы использовать ленивый метод (например, LazyVGrid), который располагал бы объекты по мере их перечисления один за другим. Но мне нравится контроль и удобство использования этого нового Grid-контейнера (iOS 16).
2. Измените модель
Модель может нести обе информации в каждом объекте:
let myObjects = [ theObject(firstName: "first", secondName: "second", ...),
theObject(firstName: "third", secondName: "fourth", ...), etc.
Но фу, это просто пахнет. А что, если я решу иметь три столбца?
3. Носите с собой указку
Используйте целое число, чтобы указать на элементы массива:
ForEach(0...((myObjects.count - 1) / 2), id: \.self) { i in
GridRow {
Text(myObjects[i*2].name)
if (i*2) < myObjects.count - 1 { // to guard against an odd number of elements
Text(myObjects[(i*2) + 1].name)
}
}
}
Это также кажется болезненным и неадаптивным, если я изменю количество столбцов.
О какой технике я не думаю? Считаете ли вы что-либо из этого приемлемым?
В итоге я использовал для этого LazyVGrid
.