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)") } } } }