SwiftUI: ForEach Невозможно определить тип возврата сложного замыкания - PullRequest
0 голосов
/ 10 октября 2019

У меня странная проблема с ForEach в SwiftUI.

Это проблема: Unable to infer complex closure return type; add explicit type to disambiguate.

, если я удаляю ForEach и использую только Список, онработает, но мне нужен ForEach, потому что я хотел бы реализовать модификатор .onDelete ()

struct SummaryItemsListView: View {

    var items: [CalendarItem]

    var body: some View {
        List {
            ForEach(items, id: \.self) { item  in
//              if 1 > 0 {
                   Text("hey")
                } else {
                   Text("heu")
                }
            }
        }
        .foregroundColor(Color.AgendaColors.foreground)
    }
}



import EventKit

typealias CalendarItem = EKCalendarItem

extension EKCalendarItem: Identifiable {

    public var id: Int {
        return self.hash
    }

    var isTodo: Bool {
        return self is EKReminder
    }

    var isEvent: Bool {
        return self is EKEvent
    }
}

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

Немного помогите компилятору:

List(items, id: \.self) { item  in
    if 1 > 0 {
        Text("hey")
    } else {
        Text("heu")
    }
}

Слияние List и ForEach помогает ему немного определить тип возвращаемого значения.

ОБНОВЛЕНИЕ

Есливам нужен какой-то конкретный модификатор, такой как onDelete, и вы ДОЛЖНЫ использовать ForEach (как вы упомянули в комментарии), вы должны убедиться, что компилятор определит тип возвращаемого значения. Вы можете добиться этого, используя оператор ?::

List {
    ForEach(items, id: \.self) { item  in
        1 > 0 ? Text("hey") : Text("heu")
    }
    .onDelete { print($0) }
}
0 голосов
/ 11 октября 2019

Это потому, что это запутано вашим условным утверждением. Вместо этого оберните его в Group.

        List {
            ForEach(items, id: \.self) { item  in
                Group {
                    if 1 > 0 {
                        Text("hey")
                    } else {
                        Text("heu")
                    }
                }
            }
        }

Я предполагаю, что вы будете использовать свое условное выражение в будущем, а не просто проверять всегда true оператор. Также, как упоминал Моджтаба, вы можете объединить свои ForEach в оператор List.

0 голосов
/ 10 октября 2019

Явно объявите тип возвращаемого значения, как это,

ForEach(items, id: \.self) { item -> Text  in
...