0Pricing
Swift Academy · レッスン

EquatableなViewと@Stateのスコープ

状態の範囲を絞り、無効化の影響を抑えます。

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

等価性で処理を省略できます

SwiftUI がビューの入力に変更がないことを証明できれば、その再レンダリングを省略できます。ビューを Equatable に準拠させると、SwiftUI は正確に判定できます。

Equatable への準拠

ビューを Equatable に準拠させると、SwiftUI は古い値と新しい値を比較します。それらが等しければ、body の評価を省略します。

struct Badge: View, Equatable {
    let count: Int
    var body: some View { Text("\(count)") }
    static func == (a: Badge, b: Badge) -> Bool {
        a.count == b.count
    }
}

EquatableView

任意の Equatable ビューを .equatable() でラップすることもできます。これにより、型の呼び出し箇所をすべて変更せずに、比較に基づくスキップを要求できます。

Badge(count: total)
    .equatable()

Equatable が役立つ場合

Equatable は、入力の比較は低コストである一方、body の評価コストが高いビューで特に効果を発揮します。効果を得るには、比較コストがレンダリングコストを大幅に下回っている必要があります。

比較コストの落とし穴

== 自体のコストが高い場合(大きな配列の深い比較など)、省略しようとしているレンダリングよりもコストが高くなることがあります。比較するのは、低コストで判定に有効なフィールドだけにしてください。

static func == (a: Self, b: Self) -> Bool {
    a.id == b.id && a.version == b.version // cheap fields
}

デフォルトで合成される Equatable

保存プロパティがすべて Equatable であれば、Swift は == を合成できます。ただし、クロージャや一部の型は Equatable ではないため、それらを無視するカスタム実装が必要になる場合があります。

struct Card: View, Equatable {
    let title: String
    let onTap: () -> Void // not Equatable
    static func == (a: Card, b: Card) -> Bool { a.title == b.title }
    var body: some View { Text(title) }
}

@State のスコープを狭める

状態を高い階層に置きすぎると、その下にあるすべてが再レンダリングされます。@State を、それを所有する最小のビューまで移動し、変更が影響する UI を最小限にしてください。

// Move toggle state into the row that uses it
struct Row: View {
    @State private var expanded = false
    var body: some View { /* only this row re-renders */ Text("Row") }
}

共有する場合にのみ状態を持ち上げる

複数のビューが本当に必要とする場合にのみ、状態を上位へ持ち上げてください。それ以外の場合は、ローカル状態によって再レンダリングの影響範囲を小さく保てます。

サブビューを抽出して更新を局所化する

頻繁に変化する部分を独自のビューに抽出すると、再評価をそのビュー内に限定でき、兄弟ビューには影響しません。

struct LiveClock: View {
    @State private var now = Date()
    var body: some View { Text(now, style: .time) }
}

バインディングとスコープ

@Binding は、子ビューを親の状態に接続します。オブジェクト全体ではなく、1 つのフィールドなど範囲を絞ったバインディングを渡すことで、変更が伝播する範囲を限定できます。

struct NameField: View {
    @Binding var name: String // narrow binding
    var body: some View { TextField("Name", text: $name) }
}

Equatable とスコープを組み合わせる

最も高い効果を得るには、手法を組み合わせます。状態を狭い範囲に配置してトリガーを減らし、それでも発生するレンダリングを Equatable でスキップします。

クイックチェック: Equatable ビュー

Equatable ビューと状態のスコープについての理解を確認します。

まとめ: Equatable ビューと状態のスコープ

ビューを Equatable にする(または .equatable() を使う)と、変更のないレンダリングを SwiftUI にスキップさせられます。比較がレンダリングより大幅に低コストで、判定に有効なフィールドだけを比較する場合に効果的です。

@State はそれを所有する最小のビューに置き、範囲を絞ったバインディングを渡し、変化の激しい部分を独自のビューに抽出してください。状態のスコープを適切に絞ることと Equatable を組み合わせると、再レンダリングの回数とコストを最小限にできます。

よくある質問

「EquatableなViewと@Stateのスコープ」レッスンは無料ですか?

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

「EquatableなViewと@Stateのスコープ」で何を学びますか?

状態の範囲を絞り、無効化の影響を抑えます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「EquatableなViewと@Stateのスコープ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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