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

画像1

ドキュメントベースのアプリとは

人々は Mac の Finder や iOS の File アプリを利用してファイルを管理してきた。

画像2

これらは、その場でシームレスにアプリを開いて表示・編集できることを期待する。

画像3

Pixelmator など一度に複数のファイルを開くことができるものもある。このようなドキュメントの管理を行うアプリのことを『ドキュメントベースのアプリ(document-based app)』と呼んでいる。

画像4

Xcode はドキュメントベースのアプリには見えないが、eml ファイルやクラッシュレポートなどの追加のドキュメントを開く機能をサポートしている。

画像5

SwiftUI での作成方法

ドキュメントを扱うには DocumentGroup を利用する。引数で指定しているタイプ(ここでは TextDocument)を管理することを宣言している。

画像6

コードの階層は、アプリの所有権の階層と一致する。ここでは単一の DocumentGroup が含まれており、複数のウィンドウで開くことができるが・・・

画像7

複数のドキュメントグループをサポートすることもできるし・・・

画像8

WindowGroup と組み合わせて使うこともできる。

画像9

SwiftUI は各プラットフォームに最適化した形で表示される。例えば Mac では次のような機能を備えたアプリになり・・・

画像10

iOS では次のようになる。

画像11

デモ

以下のようなシェイプエディタを作成していく。

画像12

Multiplatform の Document App を選択して作成する。

画像13

生成されたテンプレートコードで実行すると、先ほど解説したプラットフォームの機能をもったテキストエディタが実行される。

画像14

特定のファイルをサポートするには、Info.plist の設定を編集する必要がある。サポートする Identifier を Document Types で指定したり、独自のファイルタイプについては Exported Type Indentifiers で指定する必要もある。

画像15

クロージャの引数から Binding を取得しているが、これは元のデータへの読み書きのアクセスを提供するもの。

画像16

ドキュメントを読み書きするには、ディスク上のドキュメントを表現する FileDocument プロトコルに準拠した型を作成する。readableContentTypes プロパティで読み込めるタイプを UTType で指定する。

画像17

ファイルの読み込みイニシャライザで実装する。今回は JSON で表現することにし、JSONDecoder を利用した。

画像18

ファイルの書き込みwrite メソッドで実装する。引数の FileWrapper が inout で宣言されており、これが書き込み先となるため、この引数を上書きするか変更する必要がある。

なお、この型は値型を利用しているため Copy on Write や、ユーザが編集中でも裏で保存できるなどのメリットを受けられる。

画像19

最後に、サンプルデータをイニシャライザで与えてみると・・・

画像20

無事に表示できることが確認できた。 

画像21

免責

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

関連記事


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