第十一 HStack(或其他 UI 组件)创建编译错误,"Argument passed to call that takes no arguments"

Eleventh HStack (or Other UI Component) creates compile error, "Argument passed to call that takes no arguments"

我正在使用 SwiftUI(Swift 5.1、XCode 11.2 (11B52)、MacOS Catalina 10.15.1)创建一个应用程序。 当我在视图上添加组件时,有时会出现错误。 为了查明原因,我简化了如下代码:

import SwiftUI

struct MainView: View {
    var body: some View {
        VStack {
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
            HStack {
                Text("Okay")
            }
        }
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView()
    }
}

然后,我在第一个 HStack 处遇到错误,上面写着 "Argument passed to call that takes no arguments."

如果我注释掉十一个 "HStack" 中的一个,错误就消失了。

我想知道发生了什么。 谢谢,

您需要使用 Group { ... }

SwiftUI 限制每个视图十个项目。你可以通过使用 Group 来解决这个问题 所以如果你需要更多的项目。你把它们组合在一起。由于 10 个项目的限制,每个视图只能有 10 个组,但您也可以将它们包含在 Group 中。尽管如果你要使用嵌套组,最好重构你的代码并以不同的方式编写它,要么使用 ForEach 要么让你的代码更加组件化。

struct MainView: View {
    var body: some View {
        VStack {
            Group {
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
                HStack {
                    Text("Okay")
                }
            }
            HStack {
                Text("Okay")
            }
        }
    }
}

HackingwithSwift 有一篇很棒的文章解释了原因。可以看看here

This is because SwiftUI’s view building system has various code designed to let us add 1 view, 2 views, 3 views, or 4, 5, 6, 7, 8, 9, and 10 views, but not for 11 and beyond – that doesn’t work.