SwiftUI ビュー内に直接配置するビューが多くてビルドエラーになる場合

現象

Xcode 10.15.1 / Swift 5.1.2

ドキュメントのどこに記載があるかは不明だが SwiftUI でビュー内に配置できるサブビューは 10 個までのようだ。

たとえば

struct ContentView: View {
    var body: some View {
        VStack {
            Text("1")
            Text("2")
            Text("3")
            Text("4")
            Text("5")
            Text("6")
            Text("7")
            Text("8")
            Text("9")
            Text("10")
            // Text("11")
        }
    }
}

上記のコードでは Text ビューを 10 個配置していてビルドができる状態である。

しかし、コメントアウトされている Text("11") を有効にして 11 個ビューを配置しようとすると、ビルドエラーになる。

厄介なのが、この時に出力されるビルドエラーは、直接的にビューの限度数について示したものではないから、この制約に気付きにくい。

例えば以下のエラーが出ることを確認した。ここからビュー数の制限に気付くのは不自然である。

'Int' is not convertible to 'CGFloat?'
Argument passed to call that takes no arguments

回避方法

1. ビューごとにまとめる

ビューをグルーピングして、ひとつのビューに直接配置するビューを減らす。

struct ContentView: View {
    var body: some View {
        VStack {
            Group {
                Text("1")
                Text("2")
                Text("3")
                Text("4")
                Text("5")
            }
            
            VStack {
                Text("6")
                Text("7")
                Text("8")
                Text("9")
                Text("10")
            }
            Text("11")
        }
    }
}

2. ForEach を使用する

ForEach を使った記述で、直接配置する方法を避ける。

struct ContentView: View {
    var body: some View {
        VStack {
            ForEach(1..<12) { i in
                Text("\(i)")
            }
        }
    }
}