Почему swift не может отобразить представления с массивом [index + 1] в ForEach l oop? - PullRequest
0 голосов
/ 01 марта 2020

Я получаю ошибку, связанную с доступом к элементу в массиве с использованием предоставленного индекса в ForEach l oop с SwiftUI.

У меня есть массив информации, который используется для передачи информации в структуру для отображения карты. Мне нужно две из этих карт на HStack, поэтому я перебираю oop по массиву и называю карты так:

ForEach(0..<array.count){item in
  Card(name: array[item].name)
  Card(name: array[item+1].name)
}

Но это выдает ошибку: The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

Что Я пытаюсь сделать sh набором горизонтальных стеков по 2 предмета в одном VStack. Таким образом, у меня есть список 2 бок о бок карт. Это казалось простым способом просто перебить это поведение, но я продолжаю сталкиваться с ошибкой.

Я, вероятно, просто собираюсь переключиться на другой стиль Hstack, который будет переноситься на следующую строку для каждого третьего добавленного ряда, но я все же хотел бы знать, может ли кто-нибудь сказать мне, почему возникает эта ошибка. Кажется, это такая простая операция, но она не может быть выполнена компилятором

Вот фактический код, который я запускаю, если приведенный выше пример не обрезает его , Самым странным в этом коде является то, что он выходит из строя только после элемента SECOND +1. Я могу запустить это, если я сделаю это только один раз в коде.

        ForEach(0..<self.decks.count){item in

             HStack(spacing: 30){
                if(item+1 < self.decks.count){
                    StudyCards(cardTitle: self.decks[item].deckTitle, cardAmt: self.decks[item].stackAmount, lastStdy: self.decks[item].lastStudied)

                    StudyCards(cardTitle: self.decks[item+1].deckTitle, cardAmt: self.decks[item+1].stackAmount, lastStdy: self.decks[item+1].lastStudied)
                }
                Spacer()
                    .padding(.bottom, 4)
             } else{
                    StudyCards(cardTitle: self.decks[item].deckTitle, cardAmt: self.decks[item].stackAmount, lastStdy: self.decks[item].lastStudied)
           }

            }
        }

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Хорошо, так что я получил решение!

Я использовал эту реализацию конструктора представлений здесь: (https://www.hackingwithswift.com/quick-start/swiftui/how-to-position-views-in-a-grid)

struct GridStack<Content: View>: View {
    let rows: Int
    let columns: Int
    let content: (Int, Int) -> Content

    var body: some View {
        VStack(spacing: 30){
            ForEach(0 ..< rows, id: \.self) { row in
                HStack(spacing: 30){
                    ForEach(0 ..< self.columns, id: \.self) { column in
                        self.content(row, column)
                    }
                }
            }
        }
    }

    init(rows: Int, columns: Int, @ViewBuilder content: @escaping (Int, Int) -> Content) {
        self.rows = rows
        self.columns = columns
        self.content = content
    }
}

И затем я звоню это так ниже. Мне пришлось добавить оператор if, потому что без него он рендерил лишнюю карту. Теперь я успешно реализовал сетку с 2 столбцами и любым количеством строк! Нет необходимости в сторонних библиотеках!

        GridStack(rows: self.rows, columns: 2){ row, col in
            if(row*2 + col < self.count){
                StudyCards(cardTitle: self.decks[row*2 + col].deckTitle, cardAmt: self.decks[row*2 + col].stackAmount, lastStdy: self.decks[row*2 + col].lastStudied)
            }
0 голосов
/ 01 марта 2020

Я повторил вашу ошибку, как вы сказали, это происходит только тогда, когда у вас есть более одного "элемента + 1" внутри ForEach, например:

Text(self.array[item + 1] + " - " + self.array[item + 1])

Так что я думаю, что проблема не связана с ваш конкретный c просмотров. Одним из решений является создание функции, которая увеличивает элемент и возвращает ваше представление:

struct ContentView: View {
    @State var array: [String] = ["zero","one","two", "three"];

    var body: some View {
        VStack {
            ForEach(0..<array.count) { item in
                Text(self.array[item])
                if item + 1 < self.array.count {
                    self.makeView(item: item)
                }
            }

        }
    }

    func makeView(item: Int) -> Text {
        let nextItem = item + 1
        return Text(self.array[nextItem] + " - " + self.array[nextItem])
    }
}

live example

Ссылка: swiftui-increment-variable- в-Еогеасп-л oop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...