Swift 在Xcode11 beta 4中工作但在beta 5中停止工作的代码出现问题
我有一个视图,它应该在beta 4中呈现GridView,一切都很好,但在Xcode 11的beta 5和macOS Catalina的beta 5中,它停止了工作Swift 在Xcode11 beta 4中工作但在beta 5中停止工作的代码出现问题,swift,swiftui,beta,xcode11,Swift,Swiftui,Beta,Xcode11,我有一个视图,它应该在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 {
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{
变量行:[[Int]]=[[0,1,2],[3,4,5]]
var body:一些观点{
VStack{
ForEach(行,id:\.self){中的行
HStack{
ForEach(行){中的项目
EmptyView()
}
}
}
}
}
}
…我得到了这个错误:
在“ForEach”上引用初始值设定项“init(uuz:content:)”要求“Int”符合“可识别”
我猜在以前的beta中,Int
符合identification
,beta 5改变了这一点。所以要解决这个问题,只需将第二个ForEach
更改为ForEach(row,id:\.self)
使现代化
删除了代码中我无法运行的部分后,我设法得到了相同的错误
错误:无法推断复杂的闭包返回类型;添加显式类型以消除歧义
看来,ForEach
希望从其主体返回一个视图,而不是像您在这里看到的那样返回多个视图:
ForEach(行){中的项目
提醒(已关闭:self.list[item]。已关闭,文本:self.list[item]。text)
self.number%3==0?无:VStack(){
self.number-1==项目?添加提醒():nil
}
}
您试图同时返回提醒
和可选的VStack
,因此编译器无法确定返回类型。这在过去可能是有效的,因为ForEach
以前可以处理元组视图,现在不再处理了-我不确定。无论是什么情况,您都需要首先将ForEach
更改为ForEach(row,id:\.self)
,正如我前面指出的,然后您必须将ForEach
中的所有内容打包成一个组,如下所示:
ForEach(行,id:\.self){中的项
团体{
提醒(已关闭:self.list[item]。已关闭,文本:self.list[item]。text)
self.number%3==0?无:VStack{
self.number-1==项目?添加提醒():nil
}
}
}
我刚才注意到的最后一件事。
struct
的名称不应为List
<代码>列表已经存在于SwiftUI中,您不应该以与框架定义的类型冲突的方式命名自定义视图。我建议您将视图重命名为提醒列表
,如果这充分说明了它的用途。将所有内容从花括号中取出,一次一点地放回去,直到找到实际问题。问题是第二个ForEach循环,但它在beta 4中起作用,因此我没有计划做什么我昨天在一个小组中我们在做快捷界面编程工作。一些人在Catalina Beta 4中安装了Beta 5,他们遇到了问题。这可能是其中的一部分。我在《平均时间》中要做的不是使用ForEach()而只是使用常规for…in,这是您的代码的一个问题,不管它是否是唯一的问题。如果您真的希望有人能够回答您的问题,那么提供我们可以实际运行的代码会很有帮助。@TobiasBauer我成功地创建了您可以运行的代码版本,我已经用两个错误的解决方案更新了我的答案。在您的ForEach
中没有id:
肯定仍然会导致问题,因此这仍然是解决方案的一部分。非常感谢id:\.self及其最终工作的团队