能登 要

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

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

FileDocument | ReferenceFileDocument - SwiftUI

SwiftUI はドキュメントベースアプリに力を入れておりSwiftUI 1st major releaseの2019年からドラッグ&ドロップの処理に積極的だったのでドキュメントベースに力を入れていることは明らかだった。

SwiftUI 2st major releaseの2020年ではさらにドキュメントベースアプリへの注力が顕著でUIKit、Cocoa frameworkベースで煩雑だったドキュメントベースアプリの記述をDocumentGroup/FileDocument で簡潔に書けるようになった。Xcode上でのMultiplatformの選択肢としてDocumentApp が選べる&テンプレートが用意されたことで開発ツールのサポートも強化されている。

import SwiftUI

@main
struct DocumentTestApp: App {
    var body: some Scene {
        DocumentGroup(newDocument: DocumentTestDocument()) { file in
            ContentView(document: file.$document)
        }
    }
}

ドキュメントのprotocol としてFileDocument/ReferenceFileDocument が選択できる。FileDocumentはXcodeが生成する際に使用している。ではReferenceFileDocument はなんだろうか?Reference という意味からしてリソースをネットワーク経由でも持ってくるという話だろうか?

2020年8月現在。サンプルは以下のものが見つかる。

Using ReferenceFileDocument in SwiftUI | by Aaron Wright | Jul, 2020 | Medium

サンプルコードではFileDocumentで記述されていたものをReferenceFileDocument で置き換えるサンプルでFileDocument とReferenceFileDocumentの違いを示しているわけではない。


正解はReferenceFileDocumentは、ObservableObjectから派生したFileDocumentプロトコル準拠の定義となる。実装上の都合でObservableObjectから派生した定義の方が良いのでわざわざ定義を追加したと思うが、公式のサンプルコード無し。キーワードにFile/Documentが入っているためWeb検索もノイズが多いなどAppleがドキュメントベースアプリを押すのであればAppleからもう少しサポートが欲しいところはある。

参考