【问题标题】:Problem with code which worked in Xcode11 beta 4 but stop working in beta 5在 Xcode11 beta 4 中工作但在 beta 5 中停止工作的代码问题
【发布时间】:2019-12-09 09:45:28
【问题描述】:

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

【问题讨论】:

  • 把花括号里的所有东西都拿出来,每次放回去一点,直到找到真正的问题。
  • 问题是第二个 ForEach 循环,但它在 beta 4 中有效,所以我不知道该怎么做
  • 我昨天在一个小组里,我们正在做 SwiftUI 编程工作。有些人在 Catalina Beta 4 中安装了 Beta 5,但他们遇到了问题。这可能是其中的一部分。我平时会做的不是使用 ForEach() 而是使用常规的 for...in

标签: swift swiftui beta xcode11


【解决方案1】:

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

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'

我猜在以前的 beta 中 Int 符合 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
    }
}

您尝试返回 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
        }
    }
}

我刚刚注意到的最后一件事。您的struct 的名称不应为ListList 已经存在于 SwiftUI 中,您不应以与框架定义的类型冲突的方式命名您的自定义视图。我建议你将你的视图重命名为ReminderList,如果这充分描述了它的目的。

【讨论】:

  • 那是你的代码的问题,不管它是否是唯一的问题。如果您真的希望有人能够回答您的问题,提供我们可以实际运行的代码会有所帮助。
  • @TobiasBauer 我设法创建了一个我可以运行的代码版本,并且我已经用两个错误的解决方案更新了我的答案。在您的 ForEach 中没有 id: 肯定仍然会导致问题,因此这仍然是解决方案的一部分。
  • 非常感谢 id: \.self 和它终于工作的 Group
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多