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 changesbody内の処理を避ける
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フィードバックを取得できます。ローカル設定は不要です。