The Оригинальное название: Swiftui for Разработчики IOS
Что такое SwiftUI?
SwiftUI — это декларативная структура Apple для создания пользовательских интерфейсов на всех платформах Apple — iOS, iPadOS, macOS, watchOS и tvOS. Представленная в 2019 году, она заменяет императивный подход UIKit (где вы вручную управляете обновлениями просмотра) простым синтаксисом. В SwiftUI вы описываете, как должен выглядеть ваш пользовательский интерфейс и как он должен себя вести, а фреймворк автоматически обрабатывает все остальное. Это приводит к более чистому коду, меньшему количеству ошибок и более быстрым циклам разработки.
Для новых разработчиков iOS SwiftUI — лучшее место для начала. Он резко сокращает количество кода, необходимого для создания интерактивных приложений, и легко интегрируется с функцией предварительного просмотра Xcode, поэтому вы сразу видите изменения. Apple продолжает инвестировать значительные средства в SwiftUI, добавляя новые элементы управления, макеты и возможности с каждым выпуском. Изучая SwiftUI, вы сначала создаете основу, которая останется актуальной на долгие годы.
Почему стоит выбрать SwiftUI вместо UIKit?
Многие старые ресурсы по-прежнему учат UIKit как дефолту. В то время как UIKit остается мощным и необходимым для определенных продвинутых сценариев, SwiftUI предлагает несколько преимуществ как для начинающих, так и для опытных разработчиков:
- Код с наименьшим количеством шаблонов: Простое приложение «Hello, World» в UIKit требует раскадровки или нескольких строк кода.В SwiftUI это одна структура и одна строка текста.
- Живой предварительный просмотр: Canvas Xcode позволяет видеть обновление пользовательского интерфейса в режиме реального времени при редактировании кода, что позволяет быстро итерировать его без повторной компиляции.
- Государственный интерфейс: SwiftUI автоматически передаёт представления при изменении базовых данных, устраняя логику ручной синхронизации, необходимую в UIKit.
- Согласованность кросс-платформенных решений: Напишите свои взгляды один раз, и они работают на iPhone, iPad, Mac, Apple Watch и Apple TV с минимальными настройками для конкретной платформы.
- Современные функции Swift: SwiftUI использует передовую систему типов Swift, обертки свойств и создатели результатов для создания экспрессивного и безопасного кода.
Тем не менее, UIKit не имеет значения. Для сложных анимаций, низкоуровневого рисования или совместимости со старым кодом вам все еще может понадобиться UIKit. Но для новичка, сосредоточившись на SwiftUI, вы быстрее создадите реальные приложения. Собственной документации Apple SwiftUI является авторитетной ссылкой.
Начало работы с SwiftUI
Для начала вам нужен Mac с Xcode 14 или более поздним (Xcode 15+ рекомендуется для последних функций SwiftUI). Загрузите Xcode из Mac App Store или сайта Apple Developer. После установки выполните следующие действия:
- Откройте Xcode и выберите Создать новый проект Xcode.
- Выберите iOS в качестве платформы, затем выберите Приложение шаблон.
- Установите интерфейс на SwiftUI и язык на Swift.
- Назовите свой проект и сохраните его в нужном месте.
Xcode генерирует файл по умолчанию с простым видом, который отображает «Привет, мир!». Рядом с редактором кода вы увидите холст предварительного просмотра. Если холст скрыт, нажмите меню Editor и выберите Canvas. Этот живой превью - ваш лучший друг - каждое изменение, которое вы делаете в коде, появляется мгновенно.
Анатомия SwiftUI View
Каждый вид в SwiftUI соответствует протоколу и реализует одно требуемое вычислительное свойство: . свойство описывает содержание и макет вида. Вот минимальная структура:
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, SwiftUI!")
}
}
Тип возврата является непрозрачным типом — он сообщает компилятору, что тело возвращает какой-то конкретный тип, который соответствует , но вам не нужно точно указывать, какой именно.
Вы можете составить несколько просмотров, используя контейнеры компоновки, такие как , и .
struct ContentView: View {
var body: some View {
VStack {
Text("Welcome")
.font(.largeTitle)
Text("Start building with SwiftUI")
.foregroundColor(.secondary)
}
.padding()
}
}
Здесь расположил своих детей вертикально, а модификатор добавляет пространство вокруг всего стека. Модификаторы могут быть прикованы к цепи на любом виде, чтобы настроить его внешний вид или поведение.
Виды и модификаторы - основные строительные блоки
SwiftUI предоставляет богатую библиотеку встроенных просмотров , таких как , , , , , , и т. д. Каждый вид может быть настроен с помощью модификаторов — методов, которые возвращают новую версию представления с применяемой модификацией. Общие модификаторы включают:
- — устанавливает стиль шрифта
- — изменение цвета текста
- — добавляет по умолчанию набивку вокруг вида
- — заполняет фон цветом
- — обводит углы формы или изображения
- — добавляет капельную тень
Модификаторы могут применяться в любом порядке, но порядок имеет значение, потому что каждый модификатор обертывает предыдущий вид. Например, сначала накладывает содержимое, а затем рисует фон, в результате чего вокруг мягкой области образуется красный прямоугольник. Обратите порядок и вы получите красный фон с текстом внутри, без дополнительной набивки.
Контейнеры для макета: VStack, HStack, ZStack
SwiftUI использует три основных контейнера стека для организации просмотров:
- VStack — устраивает детей вертикально (сверху вниз)
- HStack — устраивает детей горизонтально (слева направо)
- ZStack — накладывает детей друг на друга (глубокий порядок)
Вы можете произвольно вставлять стеки для создания сложных макетов. Каждый стек также поддерживает параметры и . Например:
VStack(alignment: .leading, spacing: 20) {
Text("Top")
HStack {
Text("Left")
Text("Right")
}
ZStack {
Color.blue
Text("Overlay")
.foregroundColor(.white)
}
.frame(height: 100)
}
Это создает вертикальный стек с ведущим выравниванием, содержащий заголовок, горизонтальную пару и синий прямоугольник с белым текстом, центрированным сверху.
Управление государством в SwiftUI
Одна из самых мощных функций SwiftUI — это то, как он обрабатывает динамические данные. Вместо ручного обновления пользовательского интерфейса при изменении данных вы объявляете данные как состояние , и SwiftUI автоматически переоформляет затронутые представления. Это устраняет целый класс ошибок, связанных с синхронизацией пользовательского интерфейса.
SwiftUI предоставляет несколько оберток свойств для управления состоянием, каждый из которых подходит для разных сценариев:
Использование @State для местного государства
используется для простых значений, которые принадлежат исключительно одному виду, например, состоянию включения/выключения переключателя или входу текстового поля. При изменении значения повторно вызывается представление . Пример:
struct ToggleExample: View {
@State private var isOn = false
var body: some View {
Toggle("Enable Notifications", isOn: $isOn)
.padding()
}
}
Обратите внимание на префикс — он создает , связывающий с состоянием, позволяя читать и записывать значение. Всегда помечайте с , чтобы обеспечить его внутреннюю сторону.
@Binding for Passing State Down (недоступная ссылка)
Когда вид ребенка должен изменить состояние, принадлежащее родителю, вы используете . Ребенок получает привязку к значению и может изменить его, а вид родителя обновляется автоматически.
struct ParentView: View {
@State private var showSheet = false
var body: some View {
ChildView(showSheet: $showSheet)
}
}
struct ChildView: View {
@Binding var showSheet: Bool
var body: some View {
Button("Toggle Sheet") {
showSheet.toggle()
}
}
}
Связывания — это клей, который соединяет взгляды в иерархии без введения сложных делегированных или обратных шаблонов.
Наблюдаемые объекты и @StateObject
Для более сложных моделей данных, совместно используемых в нескольких представлениях, создайте класс, соответствующий . Внутри класса пометьте свойства , чтобы изменения запускали обновления просмотра. Затем используйте в виде, который владеет объектом. Пример:
class UserSettings: ObservableObject {
@Published var username = "Guest"
}
struct SettingsView: View {
@StateObject private var settings = UserSettings()
var body: some View {
VStack {
Text("Hello, \(settings.username)")
TextField("Username", text: $settings.username)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
}
}
}
Используйте только при инициализации объекта в этом представлении.Если объект создан в другом месте, используйте , чтобы наблюдать его, не принимая на себя ответственность.
@EnvironmentОбъект для общего государства
Когда вам нужно вставить один и тот же наблюдаемый объект во многие виды, не пропуская его через каждый инициализатор, используйте . Во-первых, создайте объект в родительском виде (например, точку входа в приложение) и введите его с помощью модификатора . Любой вид потомка может затем получить к нему доступ, объявив свойство с . Это особенно полезно для данных в масштабе приложения, таких как аутентификация пользователя или настройки.
@main
struct MyApp: App {
@StateObject private var settings = UserSettings()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(settings)
}
}
}
struct DetailView: View {
@EnvironmentObject var settings: UserSettings
var body: some View {
Text(settings.username)
}
}
Для более глубокого погружения в управление состоянием, документация Apple по управлению состоянием пользовательского интерфейса является отличным ресурсом.
Создание вашего первого приложения SwiftUI - приложение для заметок
Давайте применим то, что вы узнали, создав простое приложение для заметок. Приложение будет отображать список заметок, позволять пользователю добавлять новые и показывать детали при поступлении заметки.
Настройка модели данных
Создайте новый файл Swift под названием и определите модель:
import Foundation
struct Note: Identifiable {
let id = UUID()
var title: String
var content: String
}
Протокол требует свойства , которое SwiftUI использует для различения элементов в списке.
Создание списка View
В используйте для хранения массива заметок и для их отображения. Добавьте кнопку панели инструментов для создания новых заметок:
struct ContentView: View {
@State private var notes = [
Note(title: "Hello", content: "This is my first note.")
]
var body: some View {
NavigationStack {
List {
ForEach(notes) { note in
NavigationLink(destination: NoteDetailView(note: note)) {
Text(note.title)
}
}
.onDelete(perform: removeNote)
}
.navigationTitle("Notes")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: addNote) {
Image(systemName: "plus")
}
}
}
}
}
private func addNote() {
notes.append(Note(title: "New Note", content: ""))
}
private func removeNote(at offsets: IndexSet) {
notes.remove(atOffsets: offsets)
}
}
Обратите внимание на использование (iOS 16+) для навигации и для нажатия на вид детали. модификатор позволяет смахивать-удалять.
Добавление навигации и подробный просмотр
Создайте новый файл , который принимает и позволяет редактировать. Для краткости мы отобразим заголовок и контент в режиме только для чтения. Вы можете позже расширить его с помощью привязки для включения редактирования.
struct NoteDetailView: View {
let note: Note
var body: some View {
VStack(alignment: .leading, spacing: 16) {
Text(note.title)
.font(.title)
Text(note.content)
.font(.body)
.foregroundColor(.secondary)
Spacer()
}
.padding()
.navigationTitle("Note")
}
}
Запустите приложение в симуляторе или предварительном просмотре. Вы увидите список заметок, можете добавить новые, нажать, чтобы просмотреть детали, и проведите пальцем, чтобы удалить. Это базовое приложение демонстрирует список, NavigationStack, состояние и поток данных — все основные шаблоны SwiftUI.
Отладка и предварительные просмотры
Канва предварительного просмотра SwiftUI является вашим основным инструментом отладки. Если вид не выглядит правильно, проверьте цепочку модификаторов и убедитесь, что вы используете правильный контейнер компоновки.
- Недостающие , заставляющие взгляды касаться краев.
- Неправильный порядок модификаторов (например, фон перед обивкой).
- Использование без инициализации объекта.
Вы также можете добавить заявления внутри или в кнопки для проверки изменений состояния. Для отладки времени выполнения используйте меню отладки отладчика , чтобы просмотреть иерархию просмотра и проверить конфликты макета.
Еще один мощный метод заключается в использовании , чтобы увидеть, как ваш пользовательский интерфейс выглядит на разных размерах устройств. Вы также можете добавить несколько экземпляров предварительного просмотра для сравнения вариаций:
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
ContentView()
.previewDevice("iPhone 15 Pro")
ContentView()
.previewDevice("iPhone SE (3rd generation)")
}
}
}
Производительность и лучшие практики
SwiftUI разработан, чтобы быть эффективным, но есть методы, чтобы ваши приложения работали плавно:
- Используйте идентифицируемые модели для списков, чтобы помочь SwiftUI диффундировать и обновлять только измененные строки.
- Поддерживайте просмотр небольших — разбивайте большие просмотры на более мелкие, многоразовые компоненты. Это улучшает читаемость и позволяет постепенным обновлениям SwiftUI работать более подробно.
- Избегать дорогостоящих вычислений в — выполнять тяжелую работу в моделях просмотра или со свойствами . SwiftUI переоценивает всякий раз, когда состояние изменяется, поэтому держите его быстрым.
- Предпочтите для просмотра локальных данных и переместите сложную бизнес-логику на наблюдаемые объекты.
- Использовать или , чтобы предотвратить ненужные повторные рендеры, когда входные данные вид не изменились.
- Профиль с инструментами — шаблон Xcode SwiftUI в Инструментах помогает идентифицировать обновления просмотра и узкие места рендеринга.
Для того, чтобы узнать больше о SwiftUI, проверьте этот гид от Swift с Маджидом .
Следующие шаги и ресурсы
Теперь у вас есть прочная основа в SwiftUI. Чтобы продолжить обучение и создавать более продвинутые приложения:
- Исследуйте официальные учебные пособия Apple — Учебные пособия SwiftUI от Apple шаг за шагом проведут вас через создание полного приложения.
- Читать Хакинг со Swift — Пол Хадсон 100 дней SwiftUI — это бесплатный, всеобъемлющий курс.
- Перейти в реактивные шаблоны — Обучите комбинировать (реактивная структура Apple) для обработки асинхронных потоков данных и сложных конвейеров данных.
- Постройте настоящий проект — Выберите простую концепцию приложения (погоду, список дел, трекер привычек) и реализуйте ее с нуля.
- Присоединяйтесь к сообществу - форумы Swift, форумы разработчиков Apple и субреддит r/SwiftUI - отличные места для задавания вопросов и обмена вашей работой.
Заключение
SwiftUI представляет собой сдвиг парадигмы в разработке платформы Apple. Его декларативный синтаксис, автоматические обновления, управляемые состоянием, и предварительный просмотр в реальном времени делают его идеальной основой для новых разработчиков iOS, чтобы быстро начать создавать функциональные, красивые приложения. Понимая представления, модификаторы, контейнеры макета и управление состоянием, вы можете создавать динамические интерфейсы с меньшим количеством кода и меньшим количеством ошибок.
Продолжайте экспериментировать — изменяйте примеры в этом руководстве, ломайте их и исправляйте. Каждая итерация укрепляет ваше понимание. По мере роста вы узнаете, как SwiftUI интегрируется с другими фреймворками Apple, такими как Core Data, CloudKit и Swift Charts. Навыки, которые вы развиваете здесь, будут хорошо служить вам на всех платформах Apple. Счастливое кодирование!