как сгруппировать по быстрому массиву? - PullRequest
1 голос
/ 14 июля 2020

Учитывая список чисел, который требуется отображать как список строк из 7 элементов (учитывайте дни в календаре iOS приложение), можно ли условно заключить HStack в VStack, если число делится на по модулю, например?

    VStack(alignment: .center, spacing: 10) {
        ForEach(1...self.getDays(), id: \.self) { day in
            // something like if (day % 7 == 0) { VStack
            HStack(alignment: .center, spacing: 10) {
                DayView(dayNumber: day)
            }
        }
    }

Или, возможно, можно применить группу через каждые 7 элементов в списке без ViewBuilder?

Ответы [ 2 ]

1 голос
/ 14 июля 2020
struct Person {
     let id: Int
     let name: String
}
var EgArray:[Person] = [
    Person(id: 1, name: "Jonh"),
    Person(id: 2, name: "Lee"),
    Person(id: 3, name: "George"),
    Person(id: 4, name: "Jonh"),
    Person(id: 4, name: "Jonh")
]
let result = Dictionary(grouping: EgArray) { $0.name }
0 голосов
/ 14 июля 2020

Вы должны сначала создать структуру данных, которая представляет структуру вашего представления: попробуйте преобразовать 1...self.getDays() в 2D-массив, при этом каждый внутренний массив будет одной строкой вашей «сетки». Например, если бы self.getDays было 10, 2D-массив выглядел бы так:

[
    [1,2,3,4,5,6,7],
    [8,9,10]
]

После этого мы можем использовать два ForEach es для «l oop through» (Мы не на самом деле цикл через что-либо. ForEach на самом деле не oop ...) 2D-массив и создать представление.

Чтобы создать 2D-массив, вы можете использовать один из способов из этот ответ .

И тогда вы можете сделать:

VStack(alignment: .center, spacing: 10) {
    // "chunked" does the aforementioned transformation
    ForEach(Array(1...self.getDays()).chunked(by: 7), id: \.self) { row in
        HStack(alignment: .center, spacing: 10) {
            ForEach(row, id: \.self) { day in
                DayView(dayNumber: day)
            }
        }
    }
}
...