Главное
View Protocol — центральный протокол SwiftUI. Требует единственное свойство: var body: some View. body — это computed property, возвращающий описание UI. SwiftUI вызывает body при каждом изменении состояния и рендерит результат на GPU.
@ViewBuilder — Result Builder для View. Позволяет писать несколько View внутри замыкания без return и без TupleView. Поддерживает if/else, switch, ForEach. Все контейнеры (VStack, HStack, ZStack, Group) используют @ViewBuilder. Альтернатива — Group { … } для группировки без layout. some View — Opaque Type. Компилятор знает конкретный тип View (Text, Button, VStack и т.д.), но наружу возвращается как some View. Это позволяет менять тип body без изменения сигнатуры. ViewModifier — модификатор View: .font(), .padding(), .background(). Кастомный модификатор через ViewModifier protocol и .modifier().
// Пример View с @ViewBuilder и NavigationStack
struct ContentView: View {
@State private var items = ["Item 1", "Item 2"]
var body: some View {
NavigationStack {
List(items, id: .self) { item in
NavigationLink(item) {
DetailView(item: item)
}
}
.navigationTitle("Items")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Add") {
items.append("New Item")
}
}
}
}
}
}
// DetailView с @StateObject
struct DetailView: View {
let item: String
@StateObject private var viewModel = DetailViewModel()
var body: some View {
Text(item)
.task {
await viewModel.loadDetails(for: item)
}
}
}NavigationStack (iOS 16+) — data-driven навигация. Принимает путь (массив hashable значений) и отображает destination через navigationDestination. Заменяет NavigationLink с дест-вью. NavigationLink — кнопка для перехода по стеку. List — вертикальный список с возможностью секций, свайпов, удаления и перетаскивания. Form — специализированный List для настроек: секции, пикеры, toggles, текстовые поля. Section — группировка в List/Form с заголовком и футером. ViewModifier — кастомные модификаторы для переиспользования стилей. .modifier(CustomModifier()) — применение.
List в SwiftUI — аналог UITableView. Поддерживает .onDelete, .onMove, .refreshable. SwipeActions — .swipeActions { Button("Delete", role: .destructive) { } }. Form — оптимизирован для настроек: DatePicker, Toggle, Stepper, Picker. Section с header/footer — для группировки. OutlineGroup — иерархические списки (аналог UITableView с section). DisclosureGroup — сворачиваемая секция с контентом. IT Sectr рекомендует List для данных и Form для настроек.
PreviewProvider — протокол для превью в Xcode Canvas. Canvas — интерактивное превью SwiftUI (требует @main и Swift 5.9+). @ScaledMetric — адаптивный размер, масштабирующийся с Dynamic Type.
Property Wrappers — основа управления состоянием в SwiftUI. @State — локальное состояние (value type). @Binding — связь с состоянием родителя. @StateObject — создание ObservableObject. SwiftUI управляет жизненным циклом объекта. @ObservedObject — наблюдение за внешним ObservableObject. @EnvironmentObject — объект из окружения (внедрение зависимостей через .environmentObject()). @Environment — системные значения (.colorScheme, .locale). @AppStorage — UserDefaults. @FetchRequest — Core Data запрос. @FocusState — фокус ввода.
| Wrapper | Назначение | Владение |
|---|---|---|
| @State | Локальное состояние (value type) | View владеет |
| @Binding | Связь с родительским состоянием | Родитель владеет |
| @StateObject | Создание ObservableObject | View владеет |
| @ObservedObject | Наблюдение внешнего объекта | Внешний владелец |
| @EnvironmentObject | Объект из окружения | Предок владеет |
| @Environment | Системное значение | Система |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | Фокус ввода | View владеет |
@StateObject vs @ObservedObject: @StateObject — создаёт объект, @ObservedObject — наблюдает. Используйте @StateObject для первого создания модели в иерархии, @ObservedObject — для передачи дочерним view. @FocusState — управление фокусом: .focused($field, equals: .email). Поддерживает enum для нескольких полей.
@Environment — системные значения: colorScheme, locale, sizeCategory, layoutDirection, managedObjectContext. Custom Environment Values — кастомное значение через EnvironmentKey. Используется для dependency injection: передача сервисов без явных параметров. .environment() модификатор — установка значения в иерархии. @EnvironmentObject — ObservableObject из .environmentObject(). Отличается от @Environment тем, что передаёт reference type. IT Sectr рекомендует @Environment для системных значений и @EnvironmentObject для сервисов.
.task{} — async операция при появлении view. Автоотмена при исчезновении. Замена .onAppear для async/await. .onAppear{} — синхронная операция при появлении. .onDisappear{} — операция при исчезновении. .onChange(of:) — реакция на изменение значения. .onReceive(Publisher) — реакция на Combine publisher. Жизненный цикл View в SwiftUI: init → onAppear → body (рендеринг) → onDisappear. При изменении состояния: body → diff → ререндеринг. IT Sectr рекомендует .task для асинхронной загрузки и .onAppear для analytics.
.animation() — модификатор анимации. .transition() — анимация появления/исчезновения. withAnimation — явная анимация изменений состояния. matchedGeometryEffect — анимация между разными view (hero animation). PhaseAnimator (iOS 17+) — многофазная анимация на основе enum. KeyframeAnimator (iOS 17+) — покадровая анимация с keyframes. SwiftUI Animations выполняются на GPU через Core Animation. IT Sectr рекомендует .spring() для естественных анимаций и .interpolatingSpring для физических эффектов.
ObservableObject — протокол для объектов с @Published свойствами. SwiftUI подписывается на objectWillChange publisher. @Published — публикует изменения свойства. @StateObject — создаёт ObservableObject, управляет жизнью. @ObservedObject — наблюдает внешний. Combine — фреймворк для реактивного программирования. @EnvironmentObject — DI через окружение. .environmentObject() устанавливает, @EnvironmentObject читает. MVVM — стандартная архитектура: View (SwiftUI) — ViewModel (ObservableObject) — Model. IT Sectr рекомендует MVVM + @StateObject для основных ViewModel.
class UserViewModel: ObservableObject {
@Published var users: [User] = []
@Published var isLoading = false
func loadUsers() async {
isLoading = true
defer { isLoading = false }
do {
users = try await api.fetchUsers()
} catch {
print("Error: \(error)")
}
}
}
struct UsersView: View {
@StateObject private var viewModel = UserViewModel()
var body: some View {
List(viewModel.users, id: \.id) { user in
Text(user.name)
}
.task { await viewModel.loadUsers() }
.overlay {
if viewModel.isLoading { ProgressView() }
}
}
}Accessibility в SwiftUI: .accessibilityLabel(), .accessibilityHint(), .accessibilityValue(), .accessibilityAddTraits(). VoiceOver читает accessibility-метки. Dynamic Type — @ScaledMetric, @DynamicProperty. Локализация: String(localized:) (SwiftUI + String Catalog). LocalizedStringKey — автоматический перевод. Plural rules — через String Catalog (one, few, many, other). Right-to-Left (Arabic, Hebrew) — поддерживается автоматически. .environment(.layoutDirection, .rightToLeft). IT Sectr рекомендует accessibility-метки для всех интерактивных элементов.
struct AccessibleButton: View {
let action: () -> Void
var body: some View {
Button(action: action) {
Label("Settings", systemImage: "gear")
}
.accessibilityLabel("Open Settings")
.accessibilityHint("Double tap to navigate to settings screen")
.accessibilityAddTraits(.isButton)
}
}
// Dynamic Type support
struct ScalableText: View {
@ScaledMetric private var fontSize: CGFloat = 17
var body: some View {
Text("Hello, World!")
.font(.system(size: fontSize))
}
}Swift Charts (iOS 16+) — фреймворк для построения графиков. Chart { } — базовый контейнер. BarMark, LineMark, PointMark, AreaMark, RuleMark — марки. ForEach для данных. ChartAxis — кастомизация осей. .chartXAxis, .chartYAxis. ChartLegend — легенда. Interpolation — catmullRom, linear, step. Animation — .animation() для Chart. IT Sectr рекомендует Swift Charts для встроенных графиков и Charts (DGCharts) для сложных.
import Charts
struct MonthlySales: Identifiable {
let id = UUID()
let month: String
let sales: Double
}
struct SalesChart: View {
let data: [MonthlySales]
var body: some View {
Chart(data) { item in
BarMark(
x: .value("Month", item.month),
y: .value("Sales", item.sales)
)
.foregroundStyle(.blue.gradient)
}
.chartXAxisLabel("Month")
.chartYAxisLabel("Sales")
.frame(height: 200)
.padding()
}
}Swift Package Manager (SPM) — менеджер зависимостей Apple. Интегрирован в Xcode. Поддерживает: бинарные пакеты, ресурсы, тесты, swift-6 strict concurrency. Публикация пакетов через GitHub с тегом semver. SPM — стандарт де-факто для Swift-зависимостей, вытесняющий CocoaPods и Carthage. IT Sectr рекомендует SPM для всех новых проектов.
Swift Concurrency (async/await, TaskGroup, AsyncSequence) — async/await встроены в Swift 5.5+. Task — единица асинхронности. TaskGroup — параллельные задачи. AsyncSequence — асинхронная последовательность (AsyncStream, AsyncAlgorithms). Task Local Values — контекстные данные для Task. Swift Concurrency полностью заменяет Combine для асинхронных операций.
Часто задаваемые вопросы
View Protocol — базовый протокол. Требует var body: some View. body — описание UI, рендерится на GPU.
@ViewBuilder — Result Builder для множественных View. Позволяет if/else, switch, ForEach внутри контейнеров.
@StateObject — создаёт объект. @ObservedObject — наблюдает существующий. @StateObject для первого создания в иерархии.
NavigationStack — data-driven навигация. path-based, deep linking. Заменяет NavigationView.
@FocusState — управление фокусом ввода. .focused() модификатор. Поддерживает enum для нескольких полей.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.