能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

[プレゼン資料] よせあつめSwift - Swift5.9

2023年6月28日に行われた札幌iPhone開発勉強会でのプレゼンテーション資料。

WWDC23 で発表されたSwift5.9の新機能についてまとめたプレゼンテーション資料。より簡潔にソースコードを記述できるif/else switchを式として扱うアップデートから、genericコードで複数の型を引数として持つ場合の苦し紛れ感があったものを改善するtype parameter packsの導。Swift言語の仕様とは言いづらいが必要な機能を押し込めていたSwift Attributesの仕様を開発向けに公開したようなSwift macrosなどを紹介している。

プレゼンテーションした2023年6月末の時点ではSwiftUIのViewBuilderがtype parameter packsに対応していないのでおかしいなという話をしていた。

SwiftUIのViewBuilderについて簡単に説明するとSwiftの@resultBuilderの仕組みを使っている。@resultBuilder はSwift Attributes の1つでクロージャーに改行されて記述された値を別の型に変形させる機能を持つ。たとえば、

{
    1
    2
    3
}

といったSwift言語だと文法ミスに見えそうだが、各種設定ファイルにありそうな定義だとありそうな定義を許容させることもできる(そのためには実装側が@resultBuilderやgenericコードを駆使するコストはかかるが)。

話題をViewBuilderに戻すとXcode15 beta3以降ではViewBuilderがtype parameter packsに対応しておりViewBuilder関連の見苦しい定義が削除されている。

SwiftUIのViewBuilderは見苦しい記述ではあっても動作はしていたのでtype parameter packs自体が優先度がそれほど高くなかった仕様だともいえるし、Switf言語のビルド性能の向上(Switf5.7以降はSwiftのビルド性能が向上したらしい)により複薄の型を扱うことができるようになったことから2023年のタイミングでtype parameter packsが導入されたと考えられる。