SwiftUI ForEach с индексом - «Компилятор не может проверить тип этого выражения в разумные сроки»

В представлении swiftUI, которое я пишу, мне нужно использовать a, чтобы получить доступ к каждому элементу списка и его индексу. Большая часть информации, которую я смог найти об этом, говорит об использовании .enumerated() как в ForEach(Array(values.enumerated()), id: \.offset) { index, value in }

Однако, когда я пытаюсь это сделать, на мой взгляд:

      /// A popover displaing a list of items.
struct ListPopover: View {
    // MARK: Properties
    /// The array of vales to display.
    var values: [String]
    
    /// Whether there are more values than the limit and they are concatenated.
    var valuesConcatenated: Bool = false
    
    /// A closure that is called when the button next to a row is pressed.
    var action: ((_ index: Int) -> Void)?
    /// The SF symbol on the button in each row.
    var actionSymbolName: String?
    
    // MARK: Initializers
    init(values: [String], limit: Int = 10) {
        if values.count > limit {
            self.values = values.suffix(limit - 1) + ["\(values.count - (limit - 1)) more..."]
            valuesConcatenated = true

        } else {
            self.values = values
        }
    }
    
    // MARK: Body
    var body: some View {
        VStack {
            ForEach(Array(values.enumerated()), id: \.offset) { index, value in
                HStack {
                    if !(index == values.indices.last && valuesConcatenated) {
                        Text("\(index).")
                            .foregroundColor(.secondary)
                    }

                    Text(value)
                    
                    Spacer()

                    if action != nil && !(index == values.indices.last && valuesConcatenated) {
                        Spacer()

                        Button {
                            action!(index)
                        } label: {
                            Image(systemName: actionSymbolName ?? "questionmark")
                        }
                        .frame(alignment: .trailing)
                    }
                }
                .if((values.count - index) % 2 == 0) { view in
                    view.background(
                        Color(.systemGray5)
                            .cornerRadius(5)
                    )
                }
            }
        }
    }
}

Я получаю ошибку The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions на линии var body: some View {

Я также заметил, что этот код вызывает некоторые другие проблемы, например, очень медленное автозаполнение Xcode.

Есть идеи, как я могу это решить? Это кажется довольно простым представлением, и я думаю, что делаю ForEach как я должен.

Спасибо!

1 ответ

Это очень вводящая в заблуждение ошибка. На самом деле это означает, что вы что-то напортачили, но компилятор не может определить ошибку, поэтому выдает ее самому себе. Самый простой способ найти это - закомментировать части вашего bodyв фигурных скобках, пока ошибка не исчезнет. В вашем случае проблема заключается в следующем:

                  .if((values.count - index) % 2 == 0) { view in
                view.background(
                    Color(.systemGray5)
                        .cornerRadius(5)
                )
            }

Я не уверен, что вы пытаетесь сделать, но .if неверный синтаксис, и я не уверен, что view есть или откуда он должен прийти.

Другие вопросы по тегам