WWDC 2022で、AppleはSwiftUIの新しいイテレーションを発表した。これは、iOS、iPadOS、macOS、watchOS向けのUIを構築するための宣言型フレームワークである。最も重要な目玉として、SwiftUIの新しいグラフ作成機能、洗練されたナビゲーション、新しいコントロールなどがある。
SwiftUIのエンジニアのNick Teissler氏が述べているように、最新のSwiftUIのリリースは、主にAppleでの採用によって推進された。
SwiftUIがAppleでのアプリの作成方法を進化させたが、それによってのみ、この新しいデザインと機能の多くが実現されています。
Swift Chartsは、状態駆動型チャートを作成するための宣言型フレームワークである。これは、棒グラフと折れ線グラフを作成する手段である。
Chart(datapoints) { datapoint
BarMark(
x: .value("X-Axis-Label", datapoint.valueX),
y: .value("Y-Axis-Label", datapoint.valueY)
)
}
Chart(datapoints) { datapoint
LineMark(
x: .value("X-Axis-Label", datapoint.valueX),
y: .value("Y-Axis-Label", datapoint.valueY)
)
.foregroundStyle(by: .value("Category", task.category))
}
Swift Chartsでは、ほとんどのケースで意味のある結果が生成されるように色、凡例、スケールなどのデフォルト値が選択されるとTeissler氏は言っている。チャートにいくつかの修飾子を適用して、そのすべてのtrait(特性)をカスタマイズできる。また、チャート内でSwiftUIビューを使って、複雑なカスタムチャートを作成することもできる。
ナビゲーションとウィンドウ管理について言えば、SwiftUIは、スタック、分割ビュー、シーンなど、ウィンドウ管理の最も一般的な3つのパターンを更新している。
新たなNavigationStack
により、既存のNavigationView
が廃止され、データ駆動型のナビゲーションモデルが提供される。NavigationStack
は、既存のNavigationLink
と互換性があるが、新たなnavigationDestination
修飾子もサポートする。navigationDestination
修飾子は、ナビゲーション先を具体的なデータ型に関連付けるものである。navigationDestination
は、新たなNavigationLink
構文で使用できる。この構文では、宛先のビューでなく、宛先を表す値を扱うことができる。そのため、NavigationLink
で定義されたリンクをタップすると、SwiftUIは、navigationDestination
で定義される型指定された宛先を検査することにより、対応するビューを見つけてスタックにプッシュする。
NavigationStack {
List(items) { item in
NavigationLink(value: item) {
...
}
}
.navigationDestination(for: SpecificType.self) { item in
SpecificTypeView(item: item)
}
}
データ駆動型であるということは、たとえば、現在のナビゲーションパスを、最上位レベルから現在の値までの値の配列として単純に表すことができることを意味する。
新たなNavigationSplitView
を使うと複数列のレイアウトを定義できる。例えば、アイテムのサイドバーリストや、サイドバーアイテムをタップしたときに表示される詳細ビューである。NavigationSplitView
では、上述の新たなデータ駆動型ナビゲーションモデルもサポートする。分割ビューは特にiPadOSを対象としているが、小さなディスプレイでは自動的にスタックビューに変換される。
前述のように、SwiftUIには、新しいコントロール、そして既存のコントロール、フォーム、テーブルに対するより高度なカスタマイズが追加されている。
フォームは、コントロールを視覚的にグループ化し、OSのデフォルトやディスプレイサイズと一貫性が保たれるように、その視覚的な外観と配置を自動的に処理するためのメカニズムである。
コントロールの更新により、TextField
が追加された。垂直方向に拡大して固定数の行をサポートするようにTextField
を作成できる。Stepper
では、その値のフォーマットを扱えるようになり、watchOSで利用できるようになった。
テーブルがiPadOSとiOSでサポートされるようになった。そのため、すべてのプラットフォームで実行できるアプリを簡単に作成できる。iPadOSではmacOSと同じ複数列のビューを維持するが、iPhoneの表示サイズが制限されているため、テーブルには主な列のみを表示する必要がある。テーブルでは、新たなcontextMenu
修飾子を使ってコンテキストアクションをサポートできるようになった。この修飾子は、具体的なデータ型に対して適用され、単一行か複数行で機能する。
簡単に共有できるようにするために、SwiftUIでは新たなクロスプラットフォームのプライバシー保護フォトピッカーを導入している。ShareLink
ビューを使った新たな共有シートがある。ShareLink
ビューでは、共有したいデータをプレビューに関連付け、従来の共有ボタンに接続する。そして、dropDestination
修飾子が追加されており、ドラッグアンドドロップの実装するために使うことができる。
最後に、SwiftUIではグラフィックスとレイアウト機能が拡張されている。グラフィックフロントには、新しい形状、そして、グラデーション、ドロップシャドウ、アニメーションなどのカラーオプションがある。新しいLayout
プロトコルを使って、単純なグリッドを超えた複雑なレイアウトを作成できるようになった。Teissler氏によると、これによりAppKit命令型APIと同等レベルの制御が宣言型で提供される。