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
есть или откуда он должен прийти.