在 Xcode11 beta 4 中工作但在 beta 5 中停止工作的代码有问题
Problem with code which worked in Xcode11 beta 4 but stop working in 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()
}
}
}
}
}
错误:
无法推断复杂闭包 return 类型;添加显式类型以消除歧义
更新一:
我发现问题出在这部分代码:
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()
}
}
}
}
}
}
...我收到此错误:
Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'Int' conform to 'Identifiable'
我猜测在以前的测试版中 Int
符合 Identifiable
并且测试版 5 改变了这一点。因此,要解决此问题,只需将第二个 ForEach
更改为 ForEach(row, id: \.self)
.
更新
删除您的代码中我无法删除的部分后 运行,我设法得到了同样的错误。
Error: Unable to infer complex closure return type; add explicit type to disambiguate
ForEach
似乎希望从其正文中 return 编辑一个视图,而不是像您在此处看到的多个视图:
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
}
}
您正在尝试 return Reminder
和可选的 VStack
,因此编译器无法确定 return 类型应该是什么.这在过去可能有用,因为 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
如果这充分描述了它的目的。
我有一个视图,它应该在 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()
}
}
}
}
}
错误: 无法推断复杂闭包 return 类型;添加显式类型以消除歧义
更新一: 我发现问题出在这部分代码:
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()
}
}
}
}
}
}
...我收到此错误:
Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'Int' conform to 'Identifiable'
我猜测在以前的测试版中 Int
符合 Identifiable
并且测试版 5 改变了这一点。因此,要解决此问题,只需将第二个 ForEach
更改为 ForEach(row, id: \.self)
.
更新
删除您的代码中我无法删除的部分后 运行,我设法得到了同样的错误。
Error: Unable to infer complex closure return type; add explicit type to disambiguate
ForEach
似乎希望从其正文中 return 编辑一个视图,而不是像您在此处看到的多个视图:
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
}
}
您正在尝试 return Reminder
和可选的 VStack
,因此编译器无法确定 return 类型应该是什么.这在过去可能有用,因为 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
如果这充分描述了它的目的。