SwiftUI:尝试在 Xcode 12 beta 2 中构建 iOS 13 和 iOS 14 时使用 if #available 时出错

SwiftUI: Error while using if #available while trying to build to iOS 13 and iOS 14 in Xcode 12 beta 2

所以我正在努力做到这一点,以便我的应用程序可以部署在 iOS 13(技术上我想要 iOS 13.5)以及 iOS 14,所以我编写了这些代码行来测试它:

struct ContentView: View {
    var body: some View {
        if #available(iOS 14.0, *) {
            List {
                Text("Cool!")
                Text("Cool!")
                Text("Cool!")
                Text("Cool!")
            }
            .listStyle(InsetGroupedListStyle())
            
        } else {
            List {
                Text("Cool!")
                Text("Cool!")
                Text("Cool!")
                Text("Cool!")
            }
            .listStyle(GroupedListStyle())
            .environment(\.horizontalSizeClass, .regular)
        }
    }
}

构建到 iOS 14 效果很好,但是,每当我在物理 phone 和模拟器上构建到 iOS 13.5 时,我在 AppDelegate 中收到此错误:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

我已确保将我的 iOS 部署目标设置为 iOS 13.5,并且我正在使用 Xcode 12 beta 2。我已尝试将 beta 1 与相同的结果(虽然我使用了相同的文件,所以可能这就是为什么?)。我不确定我是否做错了什么或者这是一个错误。当单独使用 iOS 13.5 的代码(没有 if #available)时,它按预期工作,但只有当我添加该检查器时,我的问题才会出现。如有任何帮助,我们将不胜感激!

不幸的是,我可以在 Xcode 12 beta 4 中重现这个错误,所以这里有一个解决方法。您可以将 iOS 14 代码包装到 AnyView 中,所有代码都会编译成功。在这种特殊情况下,您可以使用 ViewModifier 使代码看起来更快捷。

struct ContentView: View {
    var body: some View {
        List {
            Text("Cool!")
            Text("Cool!")
        }
        .modifier(GroupedListModifier())
    }
}

struct GroupedListModifier: ViewModifier {
    func body(content: Content) -> some View {
        Group {
            if #available(iOS 14, *) {
                AnyView(
                    content
                        .listStyle(InsetGroupedListStyle())
                )
            } else {
                content
                    .listStyle(GroupedListStyle())
                    .environment(\.horizontalSizeClass, .regular)
            }
        }
    }
}

此错误应在 Xcode 12 beta 5 及更高版本中修复。如果不是,请使用反馈助手报告问题。

对于任何好奇的人来说,问题是,即使 iOS 14 分支没有在 iOS 13 台设备上进行, 的视图类型 已由该分支生成,但仍由 SwiftUI 处理,其中一些类型在 iOS 13 中不存在。 之所以有效,是因为它隐藏了 iOS 14 分支,以便 SwiftUI 不会处理它,除非采用该分支。事实上,Xcode 12 beta 5 通过自动包装 AnyView 中的 if #available 分支基本上修复了这个错误。