2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

概要

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

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関数が複数オーバーロードされる構成になっており、最大でC0C9の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個のオーバーロードが削除されています。かわりにrepeateachが記述された定義が追加されています。repeateachとはSwift 5.9で追加されたVariadic Genericsであり引数の上限がなくなります。

結論

XCode 14.3.1ではViewBuilder.buildBlockがオーバーロードされる構成で定義されていたため引数に上限がありました。しかし、Swift 5.9からはVariadic Genericsを使うことにより引数の上限をなくすことが可能になりました。これによりSwift 5.9がサポートされたXCode 15ではVStackにViewを11個以上置けるようになったということです。

参考

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?