Swift Academy · Урок

Сравнимые представления и область действия @State

Сужайте область состояния, чтобы ограничить инвалидирование.

Урок 3 из 413 шагов

«Сравнимые представления и область действия @State» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Проверка равенства позволяет не выполнять лишнюю работу

Если SwiftUI может доказать, что входные данные представления не изменились, он может не выполнять его повторную отрисовку. Сделав представление Equatable, Вы даёте SwiftUI точный способ принять это решение.

Соответствие протоколу сравнимости

Добавьте своему представлению соответствие 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(), чтобы включить пропуск на основе сравнения, не изменяя повсеместно места вызова типа.

Badge(count: total)
    .equatable()

Когда сравнимость полезна

Сравнимость особенно полезна для представлений с недорогими для сравнения входными данными и дорогим вычислением body. Чтобы это окупилось, стоимость сравнения должна быть намного ниже стоимости отрисовки.

Ловушка стоимости сравнения

Если сам оператор == работает долго, например при глубоком сравнении больших массивов, он может стоить дороже отрисовки, которую Вы пытаетесь пропустить. Сравнивайте только недорогие поля, однозначно определяющие результат.

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

Автоматический синтез сравнения

Если все хранимые свойства поддерживают сравнение, Swift может автоматически создать ==. Однако замыкания и некоторые типы не поддерживают сравнение, поэтому может потребоваться собственная реализация, игнорирующая их.

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 в самое маленькое представление, которому оно принадлежит, чтобы изменения затрагивали минимальную часть интерфейса.

// 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 связывает дочернее представление (child) с состоянием родительского представления (parent). Передача узкой привязки, например одного поля, вместо всего объекта ограничивает изменения, которые распространяются дальше.

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

Сочетание сравнимости с узкой областью действия

Лучшие результаты дают несколько методов одновременно: узкое размещение состояния уменьшает число источников обновлений, а Equatable позволяет пропустить те повторные отрисовки, которые всё же запускаются.

Проверка: сравнимые представления

Проверьте, насколько Вы понимаете сравнимые представления и область действия состояния.

Итоги: сравнимые представления и область действия состояния

Сделав представление сравнимым или используя .equatable(), Вы позволяете SwiftUI пропускать отрисовку неизменившихся представлений. Это оправданно, когда сравнение намного дешевле отрисовки и использует только поля, однозначно определяющие результат.

Ограничивайте @State самым маленьким представлением, которому принадлежит состояние, передавайте узкие привязки и выносите часто меняющиеся части в отдельные представления. Сочетание узкой области состояния со сравнением даёт минимальное число недорогих повторных отрисовок.

Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Сравнимые представления и область действия @State» бесплатный?

Да — полный текст урока «Сравнимые представления и область действия @State» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сравнимые представления и область действия @State»?

Сужайте область состояния, чтобы ограничить инвалидирование. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Сравнимые представления и область действия @State»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Понимание идентичности представлений
  2. Минимизация повторной оценки body
  3. Сравнимые представления и область действия @State
  4. Профилирование с помощью инструмента SwiftUI
← Назад к Swift Academy