【XCode15】SwiftUIのViewの数の上限がなくなった理由

# 概要
XCode15でSwiftUIのViewが11個以上並べることが可能になりました。背景については以下の記事をご参照ください。本記事ではViewを11個以上並べられるようになった理由について記載しました。

https://qiita.com/taikeshihanafu/items/4b48a1c22969b5af1377

# 10個以下の制限があった理由
以下はXCode 14.3.1の`VStack`の定義です。末尾の引数にTrailing Closureとして`@ViewBuilder`を付与されたクロージャがあることがわかります。
```
@frozen public struct VStack<Content> : View where Content : View {
    @inlinable public init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil, @ViewBuilder content: () -> Content)
}
```
この`@ViewBuilder`は、Swift5.1で導入された関数ビルダであり、`ViewBuilder.buildBlock`関数が暗黙的に呼び出されます。
では`ViewBuilder.buildBlock`の定義はどうなっているでしょうか？
以下がXCode14.3.1の`ViewBuilder.buildBlock`の定義です。
```
    public static func buildBlock<Content>(_ content: Content) -> Content where Content : View
    public static func buildBlock<C0, C1>(_ c0: C0, _ c1: C1) -> TupleView<(C0, C1)> where C0 : View, C1 : View
    public static func buildBlock<C0, C1, C2>(_ c0: C0, _ c1: C1, _ c2: C2) -> TupleView<(C0, C1, C2)> where C0 : View, C1 : View, C2 : View
    public static func buildBlock<C0, C1, C2, C3>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> TupleView<(C0, C1, C2, C3)> where C0 : View, C1 : View, C2 : View, C3 : View
    public static func buildBlock<C0, C1, C2, C3, C4>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4) -> TupleView<(C0, C1, C2, C3, C4)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View
    public static func buildBlock<C0, C1, C2, C3, C4, C5>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5) -> TupleView<(C0, C1, C2, C3, C4, C5)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View
    public static func buildBlock<C0, C1, C2, C3, C4, C5, C6>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6) -> TupleView<(C0, C1, C2, C3, C4, C5, C6)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View
    public static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View
    public static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7, C8>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View, C8 : View
    public static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7, C8, C9>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8, _ c9: C9) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8, C9)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View, C8 : View, C9 : View
```
`buildBlock`関数が複数オーバーロードされる構成になっており、最大で`C0`〜`C9`の10個までの引数しか対応してません。
# XCode15における`ViewBuilder.buildBlock`の定義
一方でXCode15はどのように定義されているでしょうか？
XCode15の`ViewBuilder.buildBlock`の定義は以下です。
```
    public static func buildBlock<Content>(_ content: Content) -> Content where Content : View
    public static func buildBlock<each Content>(_ content: repeat each Content) -> TupleView<(repeat each Content)> where repeat each Content : View
```
10個のオーバーロードが削除されています。かわりに`repeat`と`each`が記述された定義が追加されています。`repeat`、`each`とはSwift 5.9で追加されたVariadic Genericsであり引数の上限がなくなります。
# 結論
XCode 14.3.1では`ViewBuilder.buildBlock`がオーバーロードされる構成で定義されていたため引数に上限がありました。しかし、Swift 5.9からはVariadic Genericsを使うことにより引数の上限をなくすことが可能になりました。これによりSwift 5.9がサポートされたXCode 15では`VStack`にViewを11個以上置けるようになったということです。

# 参考
以下を参考にさせていただきました。

https://qiita.com/yoshitaka/items/bc7afcf0701601ea3f7b#vstack%E3%81%AE%E5%86%85%E9%83%A8%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE