SwiftUI — Apple ekosisteminin bütün platformalarında istifadəçi interfeysləri qurmaq üçün deklarativ freymvorkdur. İmperativ addımları təsvir etmək əvəzinə, tərtibatçı interfeysin necə görünməli olduğunu bəyan edir, SwiftUI isə onun göstərilməsi və yenilənməsini idarə edir. Apple Developer Documentation (2025)-a görə, SwiftUI iOS 15+, iPadOS 15+, macOS 12+, watchOS 8+ və tvOS 15+ dəstəkləyir və interfeysin bütün komponentləri üçün əsas tikinti bloku kimi View Protocol-dan istifadə edir.
Əsas məqamlar
body xassəsi ilə — SwiftUI-nin hər bir UI komponentinin əsası, view-ların kompozisiyası vasitəsilə ekran təsvirini qaytarır.SwiftUI — Apple tərəfindən 2019-cu ildə yeni layihələrdə UIKit-i əvəz etmək üçün təqdim edilmiş deklarativ freymvorkdur. UIView nümunələrini əl ilə yaratmaq və onları iyerarxiyaya əlavə etmək əvəzinə, tərtibatçı View protokoluna uyğun strukturlar vasitəsilə interfeysi təsvir edir. SwiftUI avtomatik olaraq cari və yeni vəziyyət arasındakı fərqi hesablayır və öz render mühərrikindən istifadə edərək yalnız dəyişmiş hissələri yenidən çəkir.
Freymvork Swift dilində value semantics (siniflər deyil, strukturlar) istifadə edilərək yazılıb, bu da UI komponentlərini yüngül və thread-təhlükəsiz edir. UIKit-də UIViewController Objective-C runtime səbəbindən 200+ bayt çəkə bilərkən, SwiftUI View sadəcə bir neçə bayt ölçüsündə olan strukturdur. Bu, məhdud yaddaşa malik watchOS üçün xüsusilə vacibdir.
Eyni View təsviri iPhone, iPad, Mac, Apple Watch, Apple TV və Apple Vision Pro-da işləyir. SwiftUI interfeysi platformaya uyğunlaşdırır: iOS-da toxunma jestləri, macOS-da klaviatura qısa yolları, watchOS-da Digital Crown sürüşdürməsi. Bu, Apple-ın bir neçə platforması üçün proqramlar buraxan şirkətlər üçün inkişaf müddətini qısaldır, lakin hər platformanın spesifik elementləri üçün əlavə konfiqurasiya tələb edir.
SwiftUI-də hər ekran View protokolunu implementasiya edən strukturdur, yeganə tələb: some View tipində computed property body. some açar sözü (opaque type) view-ın konkret tipini gizlədir, SwiftUI-yə renderi optimallaşdırmağa imkan verir. Body daxilində tərtibatçı hazır komponentləri — Text, Image, Button, List — ViewBuilder vasitəsilə birləşdirir, o, bir neçə view-ı birinə yığır.
struct GreetingView: View {
let name: String
var var body: some View {
VStack {
Text("Salam, \(name)!")
.font(.title)
.foregroundColor(.blue)
Image(systemName: "hand.wave")
.imageScale(.large)
}
.padding()
}
}
Nümunədə VStack (şaquli yığın) Text və Image ehtiva edir. name dəyəri strukturun initi ilə ötürülür — SwiftUI-də xarici DI konteynerləri olmadan DI (Dependency Injection) belə işləyir. Hər modifier orijinalı mutasiya etmədən dəyişiklik tətbiq edilmiş yeni view qaytarır. Bu, value-tiplərin dəyişməzliyi (immutability) sayəsində mümkündür.
ViewBuilder — @resultBuilder ilə annotasiya edilmiş result builder, 10-a qədər view-ı birinə yığır. Body daxilində if/else, switch və ForEach əlavə sarğılar olmadan istifadə edilə bilər. ForEach Identifiable elementlərlə işləyir — hər view daxiletmə/silmə zamanı düzgün animasiya üçün unikal id alır.
SwiftUI-də vəziyyət ekranda hansı məzmunun göstərildiyini müəyyən edir. Vəziyyət dəyişdikdə, SwiftUI asılı view-ın body-ni yenidən yaradır və nəticəni əvvəlki ilə müqayisə edərək diff alqoritmini tətbiq edir. Vəziyyətin saxlanması üçün property wrappers istifadə olunur — hər biri öz vəzifəsini həll edir: lokal vəziyyət, uşaq view ilə əlaqə və ya xarici məlumat modeli.
struct CounterView: View {
@State private var count = 0
var var body: some View {
VStack {
Text("Sayğac: \(count)")
Button("Artır") {
count += 1
}
}
}
}
class UserViewModel: ObservableObject {
@Published var name = ""
@Published var age = 0
}
@State View strukturunun daxilində lokal sadə dəyəri (Int, String, Bool) saxlayır. SwiftUI yaddaşı strukturdan ayrı bir anbara çıxarır — buna görə View value-tip olsa belə, @State ilə xassəni dəyişmək (mutasiya etmək) olar. @ObservableObject — @Published xassələri olan siniflər üçün, dəyişiklikləri avtomatik olaraq SwiftUI-yə yenidən çəkmə ehtiyacı barədə xəbərdarlıq edir.
@Binding valideyn view-da yerləşən məlumat mənbəyi ilə ikitərəfli əlaqə yaradır. Valideyn $variable (projected value) ötürür, uşaq binding vasitəsilə dəyəri oxuyur və yazır. Bu, mətn daxil etmə və ya keçidi ayrıca komponentə çıxarmağa imkan verir, vəziyyəti valideyndə saxlayır. @Binding olmadan hər dəyişiklik yeni dəyəri yuxarı ötürmək üçün callback bağlanması tələb edərdi.
iOS 16-dan əvvəl SwiftUI-də naviqasiya NavigationView üzərində qurulmuşdu — iPad-də mürəkkəb davranışı olan (split view, double column) köhnəlmiş API. iOS 16-dan başlayaraq Apple NavigationStack-i tövsiyə edir — tip-təhlükəsiz marşrutlarla sadələşdirilmiş alternativ. Tərtibatçı mümkün marşrutların enum-unu təyin edir, NavigationStack isə dərin keçidlər və kökə qayıtma dəstəyi ilə avtomatik olaraq ekran yığınını idarə edir.
enum Route: Hashable {
case detail(id: Int)
case settings
}
struct ContentView: View {
var var body: some View {
NavigationStack {
List {
NavigationLink("Detallı ekran",
value: Route.detail(id: 42))
NavigationLink("Parametrlər",
value: Route.settings)
}
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
case .settings: SettingsView()
}
}
}
}
}
Route tipli marşrutlar: Hashable parametrləri ötürmək üçün istənilən məlumat tipindən istifadə etməyə imkan verir. navigationDestination(for:destination:) marşrut tipini hədəf view ilə əlaqələndirir. UIKit naviqasiyası üzərində üstünlük: yeni marşrut əlavə edərkən yenidən çəkmə tələb olunmur — enum-a case və switch-də işləyici əlavə etmək kifayətdir. Dərin keçidlər NavigationStack-da processDeepLink vasitəsilə işlənir.
Proqram keçidi üçün (girişdən sonra, taymer və ya server cavabından sonra) NavigationLink initi ilə @State istifadə olunur: NavigationLink(isActive: $isActive). isActive = true qoyulduqda keçid istifadəçi toxunuşu olmadan həyata keçirilir. Alternativ — NavigationStack-də $path massivinin binding-i: $path.append(Route.detail(id: 1)).
Modifier — dəyişdirilmiş view surətini qaytaran metod. UIKit-də xassələrin konfiqurasiyası mövcud view-ın mutasiyası ilə aparılarkən, SwiftUI dəyişiklik tətbiq edilmiş yeni dəyər yaradır. Modifierlər zənciri (chaining) ardıcıl çevrilmələrdən son interfeysi yığır: şrift → boşluq → rəng → kölgə → jest.
Apple 200-dən çox daxili modifier təqdim edir. Ən çox yayılanlar: .font(), .foregroundColor(), .padding(), .background(), .cornerRadius(), .shadow(), .opacity(), .offset(). Modifierlərin sırası vacibdir: .padding() .background()-dan əvvəl boşluq olan sahəni rəngləyir, sonra — yalnız daxili sahəni. Xüsusi modifierlər ViewModifier protokolu vasitəsilə yaradılır.
Modifierlər şərti olaraq ternary operatoru vasitəsilə tətbiq edilə bilər: .foregroundColor(isError ? .red : .primary). Animasiya üçün .animation(.easeInOut, value: state) istifadə olunur — animasiya modifieri vəziyyətin konkret xassəsinə bağlanır. Bu xassə dəyişdikdə, SwiftUI köhnə və yeni dəyər arasında keçidi animasiya edir. Animasiya opacity, offset, scale, rotation, ölçü və rəng ilə işləyir — hər xassə üçün müvafiq AnimatableParameter təyin edilmişdir.
Xüsusi animasiyalar üçün .transition (görünmə/ itmə) və .matchedGeometryEffect (elementin iki konteyner arasında hamar keçidi) mövcuddur. Sonuncu siyahılarda hero-animasiya üçün istifadə olunur: siyahı xanasındakı işarə təfərrüat ekranında böyük şəklə hamar şəkildə çevrilir.
SwiftUI və UIKit arasında seçim iOS tərtibatçısının ilk dilemma-larından biridir. Hər iki freymvork Apple tərəfindən dəstəklənir, lakin interfeys qurma vəzifəsini prinsipial fərqli üsullarla həll edir: SwiftUI deklarativ, UIKit imperativ. Fərq vəziyyətin idarə edilməsi, naviqasiya, performans və uyğunluqda özünü göstərir.
| Aspekt | SwiftUI | UIKit |
|---|---|---|
| Yanaşma | Deklarativ: nə göstərmək | İmperativ: necə qurmaq |
| Vəziyyət | Property Wrappers, avtomatik yenidən çəkmə | Əl ilə: reloadData, setNeedsLayout |
| UI kodu | Yığcam, modifier zəncirləri | Həcmli, NSCoder/Storyboard/konstraintlər |
| Performans | iOS 17+ yüksək, diff alqoritmi | iOS 12–16 pik, birbaşa nəzarət |
| Minimal versiya | iOS 15+ (tam dəstək) | iOS 2+ (bütün versiyalar) |
Minimal versiyası iOS 17 olan yeni layihələr üçün Apple SwiftUI-ni əsas freymvork kimi tövsiyə edir. UIKit render üzərində incə nəzarət tələb edən interfeyslər (xüsusi UICollectionViewLayout, mürəkkəb CAAnimation səhnələri) və ya iOS 12–14 dəstəyi üçün zəruri olaraq qalır. Bir çox layihə hibrid yanaşmadan istifadə edir: SwiftUI UIHostingController vasitəsilə UIKit tətbiqinə daxil edilir, UIViewRepresentable isə UIKit komponentlərini SwiftUI iyerarxiyası daxilində istifadə etməyə imkan verir.
Tez-tez verilən suallar
Bəli, UIHostingController (SwiftUI UIKit-də) və UIViewRepresentable (UIKit SwiftUI-də) vasitəsilə. Bu, miqrasiya zamanı məşhur olan hibrid yanaşmadır.
iOS 17 — tam funksionallıq: NavigationStack, Observation framework, Swift Charts. iOS 15 — istehsal üçün minimal hədd.
Ən çox yayılmış səbəb @Published xassəsinin fon ipində dəyişdirilməsidir. ObservableObject dəyişiklikləri main actor-a göndərməlidir: @MainActor class ViewModel.
.debounce Combine vasitəsilə istifadə edin: Button.publisher(for: .tap) .debounce(for: .seconds(0.3), scheduler: RunLoop.main).
Bəli, Gesture modifierləri vasitəsilə: DragGesture, LongPressGesture, MagnificationGesture, RotationGesture. Onları .simultaneousGesture() və .sequenced() ilə birləşdirin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun