我有一个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()
}
我将代码简化为可以运行的代码:
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()
}
}
}
}
}
}
...我得到这个错误:
在'ForEach'上引用初始值设定项'init(_:content :)'要求'Int'符合'Identifiable'
我猜想以前的betaInt
符合,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
}
}
您正在尝试同时返回aReminder
和optional 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
不应该是List
。List
在SwiftUI中已经存在,并且您不应以与框架定义的类型冲突的方式命名自定义视图。我建议您重命名您的视图,以ReminderList
充分说明其目的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句