忙しい人向けの App essentials in SwiftUI - #WWDC20

忙しい人向けシリーズの第16弾。

画像23

冒頭

今年の SwiftUI では Scene と App が追加され、SwiftUI だけで完全なアプリを開発できるようになった。

画像2

今日のアジェンダ。

画像3

Views, scenes, and apps

まずは View について。

画像5

アプリ上で目に見えるものはすべて View であり、画面上のピクセルは何らかの View によって提供されたもの。

画像4

しかし、iPad などのようにマルチウィンドウをサポートしたものもある。この場合、アプリが端末の画面全体をアプリが制御しているわけではなく、プラットフォームがこれらの領域を管理している。

画像6

SwiftUI ではこれらの異なる領域のことを Scenes(シーン) と呼ぶ。

画像7

iOS / watchOS / tvOS のように1つのウィンドウがフルスクリーンで表示されるものもあれば・・・

画像8

前述の iPad や Mac のように1つのアプリについて、複数のウィンドウを表示できるものもある。

画像9

macOS においてはタブにまとめることもでき、それぞれのタブが1つの Scene となる。

画像10

Apps / Scenes / Views は統一された所有権の階層となる。View は Scene を構成し、Scene は App を構成する。

画像11

実際のコード例をみていく。

この例では WindowGroup シーンは ReadingListViewer がレンダリングするウィンドウを管理する。プラットフォームによってはウィンドウを追加したり、同一ウィンドウ内にタブを表示できる機能がサポートされる。

画像12

WindowGroup シーンは、App プロトコルに準拠した構造体に含まれる。

画像13

このコードの階層は、さきほどの図と同じ階層・所有権になることが分かる。

画像14

App と View の宣言は似ていて、どちらもデータの依存関係を定義できる。ここではどちらも ReadingListStore に依存すると定義しているが、今年追加された @StateObject を利用し、App 側を所有者としている。

画像15

どちらも body プロパティを実装するが、View は View を返すのに対し、App では Scene を返す。

画像16

最後に @main は Swift 5.3 から導入されたもので、main.swift の代わりにアプリケーションのエントリポイントとして宣言できる。

画像17

Understanding scenes

読書の進捗状況を管理するアプリを例に見ていく。

画像18

iPad では新しいウィンドウを開くことができる。これは WindowGroup によって自動的に提供された機能。

画像20

ここではそれぞれのウィンドウで独立した選択状態を保持していることが分かる。シーンは共有された状態を扱えるが、View の状態は独立する。これはシーンの重要な側面。

画像19

なお、タスクスイッチャーでアプリ名と一緒に「本のタイトル」を表示しているが、これは NavigationTitle というモディファイアによるもの。

一方、Mac ではメニューまたは ”⌘ + N” のショートカットで新しいウィンドウが開ける。

画像21

iPad ではタスクスイッチャー上で表示されていた「本のタイトル」は、Mac上ではタイトルバーのエリアに表示されることが分かる。メニューからウィンドウを選択する際にも表示されるため、分かりやすい名称が重要。

画像22

前述したように、1つのウィンドウに複数タブで表示することもでき、それぞれのタブが1つのシーンに対応する。これらの機能はすべて WindowGroup シーンによって自動的に提供されたもの。

画像23

ここまで見てきたことを要約すると、WindowGroup シーンはアプリのメインとなるインターフェースを定義するもので・・・

画像24

各プラットフォームに適した形で表示される。

画像25

シーンのライフサイクルは各プラットフォームによって管理される。

画像26

Mac / iPad などでは新しいウィンドウが開かれる度に、新しいシーンのインスタンスが生成される。

画像27

各シーンは、独立した状態を保持するため、他のウィンドウに影響を与えない。

画像28

各シーンのライフサイクルはプラットフォームによって管理されるため、View の状態を保存・復元するための @SceneStorage という Property wrapper が追加された。保存・復元のタイミングは SwiftUI によって自動的に制御される。

画像29

Customizing apps

ドキュメントベースのアプリに向けた DocumentGroup というシーンも用意されている。これはドキュメント(ファイル)について、開く・編集・保存などを自動的に管理する。

画像30

詳細については Build Document-Based Apps in SwiftUI のセッションも参考のこと。

macOS アプリにおける共通機能として、設定画面(Preference)が存在する。それに対応する Settings シーンが用意されており、メニューに環境設定を自動的に表示する他、適切なウィンドウの見た目にも調整する。

画像31

メニューに関連するものとして、 commands モディファイアも追加された。

画像32

Commands プロトコルに準拠して次のように定義できる。詳細についてはドキュメントを参考のこと。

画像33

Next steps

ここで紹介した機能はごく一部に過ぎないので、他のセッションも参考のこと。

画像34

関連記事

忙しい人向けの Data Essentials in SwiftUI: Part 1 - #WWDC20
忙しい人向けの Data Essentials in SwiftUI: Part 2 - #WWDC20

忙しい人向けの What's new in Swift - #WWDC20

忙しい人向けの Build document-based apps in SwiftUI - #WWDC20

免責

・本記事は公開情報のみに基づいて作成されています。
・要約(意訳)のみなので、詳細はセッション動画をご確認ください。

役に立った記事などありましたらサポート頂けると嬉しいです。