在Xcode11 beta 4中起作用的代码的问题,但停止在Beta 5中工作



我的视图应该在beta 4中呈现一个gridview,一切都很好,但是在Xcode 11的Beta 5和Macos Catalina的Beta 5中,它停止了工作。

struct List : View {
    var rows: [[Int]]
    var spacing: CGFloat = (screen.width-330)/4
    var list: [ReminderModel]
    var number: Int
    var body: some View {
        return VStack {
            ForEach(rows, id: .self) { row in
                HStack(spacing: self.spacing) { //The error is at this bracket
                    ForEach(row) { item in
                        Reminder(closed: self.list[item].closed, text: self.list[item].text)
                        self.number % 3 == 0 ? nil : VStack() {
                            self.number-1 == item ? AddReminder() : nil
                        }
                    }
                    Spacer()
                }.padding(.top, self.spacing).padding(.leading, self.spacing)
            }
            if self.number % 3 == 0 {
                HStack() {
                    AddReminder().padding(.leading, self.spacing).padding(.top, self.spacing)
                    Spacer()
                }
            }
        }
    }
}

错误:无法推断复杂的闭合返回类型;添加显式类型以消除歧视

更新1:我发现问题是代码的这一部分:

self.number % 3 == 0 ? nil : VStack() {
    self.number-1 == item ? AddReminder() : nil
}

我也尝试过,但也没有起作用:

if (self.number % 3 != 0 && self.number-1 == item) {
    AddReminder()
}

我将您的代码简化为可以运行的东西:

struct ContentView: View {
    var rows: [[Int]] = [[0, 1, 2], [3, 4, 5]]
    var body: some View {
        VStack {
            ForEach(rows, id: .self) { row in
                HStack {
                    ForEach(row) { item in
                        EmptyView()
                    }
                }
            }
        }
    }
}

...我得到了这个错误:

引用初始化器'init(_:content :)'foreach'要求'int符合"可识别"

我猜想,在以前的betas Int中,符合Identifiable,而beta 5改变了这一点。因此,要解决此问题,只需将第二个ForEach更改为ForEach(row, id: .self)

更新

删除了无法运行的代码部分后,我设法遇到了相同的错误。

错误:无法推断复杂的闭合返回类型;添加显式类型以消除歧视

看来ForEach期望从其身体返回一种视图,而不是在这里返回:

ForEach(row) { item in
    Reminder(closed: self.list[item].closed, text: self.list[item].text)
    self.number % 3 == 0 ? nil : VStack() {
        self.number-1 == item ? AddReminder() : nil
    }
}

您正在尝试同时返回Reminder和可选的VStack,因此编译器无法确定返回类型应该是什么。过去可能会起作用,因为ForEach以前可以处理元组视图,并且不再这样做 - 我不确定。无论如何,您需要首先将ForEach更改为我之前指出的ForEach(row, id: .self),然后您必须将所有内容包装在组中的ForEach中,例如:

ForEach(row, id: .self) { item in
    Group {
        Reminder(closed: self.list[item].closed, text: self.list[item].text)
        self.number % 3 == 0 ? nil : VStack {
            self.number - 1 == item ? AddReminder() : nil
        }
    }
}

我刚刚注意到的最后一件事。您的struct的名称不应为ListList已经存在于SwiftUI中,您不应以与框架定义类型相冲突的方式命名自定义视图。我建议您将您的观点重命名为ReminderList如果充分描述其目的。

相关内容

  • 没有找到相关文章

最新更新