Перейти к содержанию

1. Основы


Изучение данного блока предполагает предварительное знание синтаксиса языка Swift. Для успешного освоения этого материала, необходимо иметь базовое понимание синтаксиса языка Swift. Это включает в себя знание основных структур данных, операторов, циклов, функций, абстракций и других ключевых элементов языка. Без этих фундаментальных знаний будет сложно понять более сложные концепции и примеры, которые будут рассматриваться в данном блоке.


SwiftUI позволяет строить интерфейс с использованием простого и интуитивно понятного синтаксиса, основанного на декларативных компонентах. Вместо традиционного императивного подхода, где вы явно указываете, как и когда обновлять элементы интерфейса, SwiftUI позволяет описать, как интерфейс должен выглядеть в зависимости от текущего состояния данных.

Принцип работы SwiftUI

  • Декларативный подход

Разработчик описывает, что должно быть на экране, а фреймворк сам решает, как это отобразить.

  • Реактивность

SwiftUI автоматически обновляет интерфейс при изменении данных — Data Driven UI. Это достигается благодаря использованию свойств, помеченных специальными атрибутами.

  • Композиция представлений

Вместо наследования, SwiftUI использует композицию. Представления можно комбинировать друг с другом, чтобы создавать сложные интерфейсы.

Протокол View

Представляет абстракцию для всех элементов интерфейса. В SwiftUI любой компонент UI, который вы создаете, должен соответствовать этому протоколу:

public protocol View {
    associatedtype Body: View
    var body: Self.Body { get }
}
associatedtype Body: View — это ассоциированный тип, который указывает, какой тип является “телом” представления. Важно, что тело также должно быть типом, соответствующим протоколу View.

var body: Self.Body { get } — это свойство, которое возвращает представление, описывающее то, как отображается UI-компонент. body должен возвращать что-то, что также соответствует протоколу View.

Почему используются структуры, как наследники View?

  • Неизменяемость

Структуры в Swift по умолчанию являются неизменяемыми. Это означает, что состояние представления не может быть изменено напрямую, что упрощает управление состоянием и делает код более предсказуемым.

  • Производительность

Структуры обычно легче и быстрее по сравнению с классами, так как не требуют управления памятью через ARC (Automatic Reference Counting).

Как работает под “капотом”?

  • Система отображения и обновления

SwiftUI использует рекурсивную систему для отображения представлений и отслеживания изменений в их состоянии. Когда состояние изменяется, SwiftUI автоматически пересчитывает и обновляет только те части интерфейса, которые были изменены.

  • Diffing

Для минимизации изменений на экране, SwiftUI использует алгоритмы диффинга, которые определяют, какие части дерева представлений изменились, и применяют только необходимые обновления.

  • Композиция и модификаторы

Представления в SwiftUI являются композируемыми, что позволяет создавать сложные интерфейсы из простых строительных блоков. Модификаторы позволяют изменять представления, не изменяя их исходный код.

Основные компоненты и их использование

  • Text — Представление для отображения текста
    Text("Hello, World!")
    
  • Image — Представление для отображения изображения
    Image(systemName: "star")
    
  • Button — Представление для создания кнопки
    Button(action: {
        print("Button tapped")
    }) {
        Text("Tap me")
    }
    
  • List — Представление для создания списка элементов
    List {
        Text("Item 1")
        Text("Item 2")
        Text("Item 3")
    }
    
  • Stack (VStack, HStack, ZStack) — Представления для организации других представлений в вертикальном, горизонтальном и наложенном порядке соответственно
    VStack {
        Text("Top")
        Text("Bottom")
    }
    

Модификаторы

  • Методы, которые применяются к представлениям для изменения их внешнего вида или поведения.
  • Каждый модификатор возвращает новое представление, измененное в соответствии с примеренными параметрами.
  • Модификаторы цепочные, что означает, что вы можете применять несколько модификаторов последовательно.

Пример:

Text("Hello, World!")
    .font(.title)
    .foregroundColor(.blue)
    .padding()

В этом примере текст сначала получает заголовочный шрифт (.font(.title)), затем синий цвет (.foregroundColor(.blue)), и, наконец, отступы (.padding())

Модификаторы жизненного цикла View

SwiftUI включает три модификатора, которые реагируют на события жизненного цикла вью:

  • onAppear(perform:) — выполняет действие при каждом появлении вью, даже если вью появилась не первый раз.
  • onDisappear(perform:) — выполняет действие при уходе с вью.
  • task(priority:_:) — выполняет действие в асинхронной среде при появлении вью. Перестает выполнять при уходе с вью (об этом подробнее в модуле Concurrency).

Ключевая разница между onAppear и task в том, что покидая вью onAppear не останавливает выполнение задачи, а task наоборот автоматически запускает и останавливает.