【ITニュース解説】How to populate your #Previews in SwiftUI

2025年09月06日に「Dev.to」が公開したITニュース「How to populate your #Previews in SwiftUI」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

SwiftUIのプレビューで、非同期処理やキャッシュを使ったデータの表示がよりスマートに行える。`PreviewModifier`を使うことで、プレビューに必要なデータを事前に生成し、`body`メソッド内でViewに反映できる。これにより、複雑な初期化処理やデータの共有が容易になり、XcodeでのUI開発が効率化される。

出典: How to populate your #Previews in SwiftUI | Dev.to公開日:

ITニュース解説

SwiftUIの#Previewマクロは、XcodeでSwiftUIビューを簡単にプレビューできる便利な機能だ。基本的な使い方は、#Previewブロックの中にプレビューしたいビューを記述するだけ。例えば、BookViewというビューをプレビューしたい場合は以下のようになる。

1#Preview {
2    BookView()
3}

さらに、プレビュー内で簡単なコードを書くことも可能だ。例えば、BookViewに渡す書籍データの配列を定義してプレビューできる。

1#Preview {
2    let books = ["Eros&Agape, by Anders Nygren", "Commentary to Galatians, by Martin Luther"]
3
4    BookView(books: books)
5}

しかし、プレビューの初期化に必要なデータをキャッシュしたい場合や、非同期処理でデータを取得する必要がある場合はどうすればいいだろうか。

当初、以下のような方法が試された。

1#Preview {
2    @Previewable @State var books: [Book]  = []
3
4    if books.isEmpty {
5        ProgressView()
6          .task {
7             books = await myAsyncFunc()
8          }
9    } else {
10        BookView(books: books)
11    }
12}

この方法は、一時しのぎの手段であり、キャッシュ機能も提供していなかった。そこで、よりAppleが推奨する方法としてPreviewModifierを使う方法がある。

PreviewModifierは、プレビューの表示をカスタマイズするためのプロトコルだ。これを利用することで、プレビューに必要なデータを非同期で取得したり、キャッシュしたりすることができる。PreviewModifierを使うには、まずこのプロトコルに準拠した構造体を定義する。

1struct BookProvider: PreviewModifier {
2    static func makeSharedContext() async -> [Book] {
3        return await myAsyncBookGenerator()
4    }
5
6    func body(content: Content, context: [Book]) -> some View {
7        BookView(books: context)
8    }
9}

makeSharedContextは、プレビューに必要なデータを生成する静的関数だ。ここでは、非同期関数myAsyncBookGenerator()を呼び出して書籍データの配列を取得している。この関数は一度だけ実行され、結果がキャッシュされる。もしデータの生成が不要な場合は、この関数を省略することもできる。デフォルトではVoid型が使われる。

body関数は、プレビューの内容をカスタマイズする関数だ。引数として、content(プレビューされるビュー)とcontextmakeSharedContextで生成されたデータ)を受け取る。ここでは、contextとして受け取った書籍データの配列をBookViewに渡して、新しいビューを返している。contentは型消去されたViewなので、直接利用することは難しい場合もある。

PreviewModifierを適用するには、#Previewマクロでtraitsパラメータを使用する。

1#Preview(traits: .modifier(BookProvider())) {
2    BookView()
3}

このように記述することで、BookProviderBookViewのプレビューに適用され、makeSharedContextで生成された書籍データがBookViewに渡される。

PreviewModifierを使うことで、プレビューに必要なデータの非同期取得やキャッシュが容易になる。特に、APIからデータを取得して表示するような複雑なビューのプレビューを作成する際に役立つだろう。

注意点として、contentの型が型消去されているため、body関数内で直接利用することが難しい場合がある。そのため、プレビューするビューを完全に置き換えるような実装になることが多い。

この方法を使えば、より高度なプレビューのカスタマイズが可能になり、開発効率の向上に繋がるだろう。SwiftUIのプレビュー機能を使いこなして、より快適な開発ライフを送ろう。