Что такое SwiftUI?

Ответ

SwiftUI — это современный декларативный фреймворк Apple для построения пользовательских интерфейсов на всех её платформах (iOS, macOS, watchOS, tvOS) с использованием синтаксиса Swift.

Ключевые принципы и особенности:

  1. Декларативный синтаксис: Вы описываете, как должен выглядеть UI в зависимости от состояния данных, а не последовательность команд для его изменения (как в императивном UIKit).
  2. Единый код для всех платформ: Одно описание интерфейса адаптируется под идиомы каждой платформы (iOS, macOS и т.д.).
  3. Реактивность на основе состояния: UI автоматически перерисовывается при изменении связанных с ним данных, помеченных как @State, @ObservedObject, @StateObject и др.

Базовый пример:

import SwiftUI

struct ContentView: View {
    // @State — свойство-источник истины, при его изменении View пересоздается
    @State private var counter = 0

    var body: some View {
        VStack {
            Text("Счётчик: \(counter)")
                .font(.title)
            Button("Увеличить") {
                counter += 1 // Изменение состояния -> автоматическое обновление Text
            }
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
        }
    }
}

Преимущества перед UIKit:

  • Меньше кода: Отсутствие boilerplate-кода (например, не нужны делегаты для таблиц).
  • Live Preview в Xcode: Мгновенный предпросмотр изменений без запуска симулятора.
  • Автоматическая доступность: Многие компоненты из коробки поддерживают динамический тип шрифта, темную тему и VoiceOver.

Ограничения:

  • Требует iOS 13+ / macOS 10.15+.
  • Некоторые сложные или специфичные UI-компоненты могут отсутствовать и требовать интеграции с UIKit (UIViewRepresentable).

Ответ 18+ 🔞

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

Представь: раньше ты был как раб на галерах — «создай кнопку, положи её сюда, а теперь, сука, если её ткнули, обнови вот тот лейбл, и не забудь про констрейнты, а то всё поплывёт». Сплошная императивная мука.

А теперь ты — бог-декларативщик. Ты просто заявляешь: «Хочу вертикальный стек, в нём текст со счётчиком и кнопку. И пусть, ебушки-воробушки, когда жмут на кнопку, счётчик растёт». И система, блядь, сама всё делает. Магия, ёпта!

Вот, смотри, как это выглядит, реальный код:

import SwiftUI

struct ContentView: View {
    // Помечаем @State — это как красная кнопка. Тронул её значение — весь вид тут же перетряхнётся.
    @State private var counter = 0

    var body: some View {
        VStack {
            Text("Счётчик: \(counter)")
                .font(.title)
            Button("Увеличить") {
                counter += 1 // Щёлк — и текст сам обновится, ни одной строчки для обновления вручную!
            }
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
        }
    }
}

Красота же? Никаких viewDidLoad, никаких IBOutlet'ов, которые можно проёбать. Написал логику — и всё.

Чем он охуенен:

  • Кода в три раза меньше. Серьёзно, как будто тебе отрезали пол-работы.
  • Живой предпросмотр в Xcode. Ты буквально видишь, что творишь, сразу. Поправил шрифт — бац, и он уже на экране. Никаких вечных запусков симулятора.
  • Заботится о доступности сам. Темная тема, увеличенный шрифт — много чего работает из коробки, не надо городить костыли.

Но и подводные камни есть, куда без них:

  • Требует свежих систем. iOS 13 и новее. Если твой проект должен поддерживать дедушку на iOS 10 — тут только UIKit, друг мой.
  • Не всё ещё придумали. Иногда нужен какой-нибудь дикий, специфичный компонент, которого в SwiftUI нет. Приходится, скрипя зубами, встраивать старый добрый UIKit через UIViewRepresentable. Но это уже, как говорится, издержки производства.

Короче, если начинаешь новый проект и не цепляешь древность — это, блядь, must have. Жизнь становится проще, а код — чище. Проверено, в рот меня чих-пых!