swift - 在 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()
}
}
}
}
}
}
...我收到了这个错误:
在 'ForEach' 上引用初始化程序 'init(_:content:)' 要求 'Int' 符合 'Identifiable'
我猜在以前的测试版中Int
符合Identifiable
并且测试版 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
以前可以处理元组视图并且不再这样做 - 我不确定。无论如何,您需要首先将 the 更改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
如果这充分描述了它的目的,我建议你将你的视图重命名为。
推荐阅读
- database - 从 postgres 中的表中获取 uniq 的多列值集
- mongodb - MongoDB - 集群没有自动发现
- excel - 如何为特定目的创建宏
- java - 无法从同一类中的方法访问类属性 ArrayList 的值
- if-statement - 嵌套 If 语句 SSRS 表达式
- excel - 执行这个宏需要很长时间,可以做些什么来加快它的速度?
- c# - C# / .NET 保持命名管道打开并支持任意数量的并行连接客户端
- javascript - 重定向到函数 React Router Dom 中的路由
- python - celery 上的 python 工作者 (crawler + save db) 的最佳设置
- r - 如何使用 geom_text() 标记 geom_bar(position = 'fill')