SwiftUI — Apple platformalarida foydalanuvchi interfeysini deklarativ usulda yaratish uchun mo‘ljallangan framework. Developer ekranda qaysi elementlar ko‘rinishi kerakligini state asosida yozadi, framework esa bu state o‘zgarganda interfeysning zarur qismlarini yangilaydi. SwiftUI iOS, macOS, watchOS, tvOS va visionOS loyihalarida qo‘llanadi.
SwiftUI Swift tilining type systemi, property wrapperlari va result builder imkoniyatlaridan foydalanadi.
Deklarativ interfeys
Imperativ UI’da developer view yaratish, property o‘zgartirish va hierarchy’ni boshqarishni ketma-ket bajaradi. SwiftUI’da esa joriy holat uchun interfeys tavsiflanadi:
struct CounterView: View {
@State private var count = 0
var body: some View {
Button("Count: \(count)") {
count += 1
}
}
}
count o‘zgarsa body qayta baholanadi.
View protokoli
SwiftUI componentlari View protokoliga mos keladi.
Asosiy talab:
var body: some View
body boshqa viewlardan tuzilgan hierarchy qaytaradi.
View odatda value type bo‘lgan struct sifatida yoziladi.
View identity
SwiftUI view structure’ni har renderda oddiy object tree sifatida saqlamaydi. Framework view identity, type va joylashuv orqali state’ni qaysi elementga tegishli ekanini aniqlaydi.
Conditional branch yoki list identity noto‘g‘ri bo‘lsa state kutilmaganda reset bo‘lishi mumkin.
State
@State view ichidagi local mutable holatni saqlaydi.
U oddiy stored propertydan farqli ravishda SwiftUI storage tizimiga ulanadi.
State faqat shu viewga tegishli bo‘lishi kerak.
Tashqi model yoki shared data uchun boshqa property wrapper ishlatiladi.
Binding
@Binding boshqa joyda saqlanadigan state’ga ikki tomonlama access beradi.
Child view qiymatni ko‘radi va o‘zgartiradi, lekin storage egasi emas.
Masalan, form field parent viewdagi textga binding olishi mumkin.
Binding ownership va data flow’ni aniq saqlaydi.
Observable model
Murakkab application state observable object yoki yangi observation tizimi bilan boshqarilishi mumkin.
Model o‘zgarganda unga bog‘langan view yangilanadi.
ni saqlashi mumkin.
Network va persistence logikasi to‘g‘ridan-to‘g‘ri body ichida yozilmaydi.
Environment
Environment view hierarchy bo‘ylab umumiy qiymatlarni uzatadi.
Misollar:
- color scheme;
- locale;
- dismiss action;
- managed object context;
- custom dependency.
Har childga parameter uzatishni kamaytiradi.
Yashirin dependency ko‘payib ketmasligi uchun custom environment qiymatlar hujjatlashtiriladi.
Layout
SwiftUI layout containerlari:
VStack;HStack;ZStack;Grid;List;ScrollView.
Parent childga mavjud o‘lchamni taklif qiladi, child o‘z o‘lchamini qaytaradi va parent joylashtiradi.
Modifier tartibi layout natijasiga ta’sir qiladi.
Modifier
Modifier view’ning ko‘rinishi yoki behaviorini o‘zgartiradi:
Text("UzbekDevs")
.font(.headline)
.padding()
Har modifier asl view’ni mutatsiya qilmay, yangi view value yaratadi.
padding().background() va background().padding() boshqa natija beradi.
Navigation
NavigationStack route va screenlar orasidagi o‘tishni boshqaradi.
Navigation path programmatik flow uchun ishlatilishi mumkin.
Deep link route’ga aylantiriladi.
Navigation state restoration va platforma versioniga mos kelishi kerak.
List
List katta ma’lumot to‘plamini platformaga mos scroll qilinadigan ko‘rinishda beradi.
Har element stable identityga ega bo‘lishi kerak.
Indexni identity sifatida ishlatish insert yoki reorder paytida noto‘g‘ri animation va statega olib kelishi mumkin.
Async task
View .task modifieri orqali asynchronous ish boshlashi mumkin.
View identity yo‘qolsa task cancellation qilinishi ehtimoli bor.
Network natijasi main actor va joriy state bilan xavfsiz bog‘lanadi.
Bir view qayta paydo bo‘lganda keraksiz duplicate request nazorat qilinadi.
Animation
State o‘zgarishi animation bilan ko‘rsatilishi mumkin.
SwiftUI transition, implicit va explicit animation beradi.
Animation faqat visual qiymat, identity yoki hierarchy o‘zgarishiga bog‘liq.
Userning reduced-motion accessibility preference’i hisobga olinadi.
Preview
Xcode preview turli holatlarni tez ko‘rsatadi:
Preview production dependencyga bevosita ulanmasligi kerak.
Mock yoki in-memory data ishlatiladi.
UIKit bilan integratsiya
Mavjud UIKit componentini UIViewRepresentable yoki UIViewControllerRepresentable bilan SwiftUI ichiga joylashtirish mumkin.
SwiftUI view esa UIHostingController orqali UIKit hierarchy’ga qo‘shiladi.
Bu bosqichma-bosqich migration imkonini beradi.
Accessibility
SwiftUI ko‘p native control uchun semantic ma’lumotni avtomatik beradi.
Custom viewlarda:
tekshiriladi.
Faqat rang yoki gesture bilan ma’no berilmaydi.
Performance
body tez va side-effectlarsiz bo‘lishi kerak.
Og‘ir hisoblash, image decoding va network ish boshqa qatlamda bajariladi.
Keraksiz katta observable object barcha viewlarni yangilashi mumkin.
Profiling Instruments bilan amalga oshiriladi.
Platform availability
SwiftUI APIlari OS versiyasiga qarab farq qiladi.
Deployment targetdan yangi API ishlatilsa availability check kerak.
Bir codebase bir nechta Apple platformasini qo‘llashi mumkin, ammo navigation va interaction har platformada bir xil emas.
Data flow
SwiftUI’da state imkon qadar bir yo‘nalishda oqadi: parent qiymat beradi, child event qaytaradi. Bir xil ma’lumotni bir nechta view ichida mustaqil nusxada saqlash sinxronizatsiya muammosi yaratadi. Source of truth aniq tanlanadi.
Equatable va update
Katta viewlarda input qiymatlari o‘zgarmaganini frameworkga ko‘rsatish ayrim optimizatsiyaga yordam berishi mumkin. Biroq qo‘lda equality qo‘shishdan oldin haqiqiy render bottleneck Instruments orqali topiladi.
Localization
Text, plural va o‘lcham turli tillarda tekshiriladi. Tarjima uzayganda layout siqilmasligi, o‘ngdan chapga yozuvda navigation va alignment moslashishi kerak.
Bog‘liq tushunchalar
SwiftUI, Swift, Declarative UI, View, State, Binding, Observable model, Environment, NavigationStack, UIKit, Xcode