在Xcode11 beta 4中有效但在beta 5中停止工作的代码出现问题

时间:2019-07-31 20:03:30

标签: swift swiftui beta xcode11

我有一个View,该View应该在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()
}

1 个答案:

答案 0 :(得分:1)

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

com.sun.org.apache.xml.internal.utils.BoolStack

...我收到此错误:

  

在'ForEach'上引用初始化程序'init(_:content :)'要求'Int'符合'Identifiable'

我猜测在先前的Beta中,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() } } } } } } 符合Int,而Beta 5改变了它。因此,要解决此问题,只需将第二个Identifiable更改为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 } } } 的名称不应为structList已存在于SwiftUI中,因此您不应以与框架定义的类型冲突的方式命名自定义视图。我建议您将视图重命名为List,以充分说明其目的。