0Pricing
Swift Academy · レッスン

bodyの再評価を最小限にする

不要なViewの再計算を減らします。

「bodyの再評価を最小限にする」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

bodyは頻繁に再計算される

SwiftUIは、入力が変わるたびにビューのbodyを呼び出します。処理が重い、または依存関係が多すぎるbodyは頻繁に再計算され、パフォーマンスを低下させます。

再評価を引き起こすもの

ビューが読み取る@State、@Binding、監視対象オブジェクト、環境値のいずれかが変わったとき、または親から新しい値が渡されたときに、bodyが再実行されます。

struct Row: View {
    let title: String // changes -> body re-runs
    var body: some View { Text(title) }
}

監視対象を絞り込む

ビューが大きなモデル全体を読み取ると、そのモデルにどのような変更があってもbodyが再実行されます。ビューに必要な具体的な値だけを渡してください。

// Instead of passing the whole model:
struct Price: View {
    let amount: Decimal // narrow input
    var body: some View { Text(amount, format: .currency(code: "USD")) }
}

大きなビューを分割する

巨大なbodyを小さなサブビューに分割します。SwiftUIは画面全体ではなく、入力が実際に変わったサブビューだけを再評価します。

struct Screen: View {
    var body: some View {
        VStack {
            Header()   // re-runs only if its inputs change
            ItemList()
            Footer()
        }
    }
}

Observableとフィールド単位の追跡

@Observableマクロを使うと、SwiftUIはビューが読み取る正確なプロパティを追跡します。model.nameだけを読み取るビューは、model.countの変更を無視します。

@Observable final class Model {
    var name = ""
    var count = 0
}
// A view reading only name won’t re-run when count changes

body内の処理を避ける

bodyはUIを低コストに記述するものです。重い計算(並べ替えやフィルタリング)はモデルまたはキャッシュされたプロパティに置き、bodyが呼ばれるたびに再計算しないようにします。

// Bad: sort inside body (runs every recompute)
// Good: sort once in the model, expose sorted array

安定したクロージャと入力

レンダリングのたびに新しく作成した配列やクロージャを渡すと、SwiftUIの等価性チェックが機能しなくなることがあります。安定した値を切り出し、再計算の前後で入力が等価になるようにしてください。

// Hoist constants out of body
private let columns = [GridItem(.flexible())]

コストの高いイニシャライザに注意する

ビューのinitは何度も実行されることがあります。SwiftUIはレンダリングしない場合でもビューの値を頻繁に作成するため、そこで重い処理を行わないでください。

struct Card: View {
    init(_ item: Item) { /* keep this trivial */ }
    var body: some View { Text("Card") }
}

環境値の読み取りによる更新コスト

環境値を読み取ると、ビューはその値の変更を購読します。再評価の範囲を小さくするため、環境値は必要な場所、つまり最も小さなサブビューでのみ読み取ってください。

@Environment(\.colorScheme) private var scheme

遅延コンテナ

LazyVStack、LazyHStack、Listを使うと、画面外の行は必要になるまで作成されません。そのため、大きなコレクションでのbodyの呼び出し回数を減らせます。

ScrollView {
    LazyVStack {
        ForEach(items) { RowView(item: $0) }
    }
}

測定してから最適化する

どのbodyの負荷が高いかを推測しないでください。SwiftUI Instrumentを使ってbodyの評価回数が多いビューを見つけ、そこでこれらのテクニックを適用します。

確認テスト:再評価

bodyの再評価について理解度を確認します。

まとめ:bodyの再評価を最小限にする

bodyは入力が変わると再実行されるため、絞り込んだ値を渡し、大きなビューを小さなサブビューに分割し、@Observableのフィールド単位の追跡を活用します。bodyとイニシャライザを軽量に保ち、安定した入力を切り出し、環境値の読み取りを最小限にし、大きなコレクションには遅延コンテナを使ってください。

最適化する前に、必ずSwiftUI Instrumentで負荷の高い箇所を確認してください。

よくある質問

「bodyの再評価を最小限にする」レッスンは無料ですか?

はい。「bodyの再評価を最小限にする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「bodyの再評価を最小限にする」で何を学びますか?

不要なViewの再計算を減らします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「bodyの再評価を最小限にする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Viewのアイデンティティを理解する
  2. bodyの再評価を最小限にする
  3. EquatableなViewと@Stateのスコープ
  4. SwiftUI Instrumentによるプロファイリング
← Swift Academyに戻る