SwiftUI:ForEach无法推断复杂的闭包返回类型

时间:2019-10-10 20:16:22

标签: ios swift swiftui ios13

SwiftUI中的ForEach出现了一个奇怪的问题。

这是问题: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 :(得分:0)

像这样明确声明返回类型,

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

答案 1 :(得分:0)

对编译器有所帮助:

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

合并ListForEach有助于检测返回类型。

更新

如果您需要诸如onDelete之类的特定修饰符,并且需要使用ForEach(如您在注释中所述),则必须确保编译器有关返回类型。您可以使用?:运算符来实现此目的:

List {
    ForEach(items, id: \.self) { item  in
        1 > 0 ? Text("hey") : Text("heu")
    }
    .onDelete { print($0) }
}

答案 2 :(得分:0)

这是因为它被您的条件语句弄糊涂了。而是将其包装在Group中。

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

我认为您实际上将在将来使用条件语句,而不仅仅是检查始终为true的语句。同样正如Mojtaba所述,您可以将ForEach合并到List语句中。