SwiftUI: bu nədir, əsas anlayışlar və View Protocol

Müəllif: IT Sectr Dərc olunub: 2026-04-30 Oxuma vaxtı: 8 dəq

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

  • SwiftUI — Apple-ın deklarativ freymvorku, burada tərtibatçı interfeysi təsvir edir, yeniləmələr isə avtomatik yerinə yetirilir.
  • View Protocol body xassəsi ilə — SwiftUI-nin hər bir UI komponentinin əsası, view-ların kompozisiyası vasitəsilə ekran təsvirini qaytarır.
  • Property Wrappers — @State, @Binding, @ObservedObject, @StateObject — vəziyyəti idarə edir və məlumat dəyişdikdə yenidən çəkməyə başlayır.
  • NavigationStack (iOS 16+) — tip-təhlükəsiz marşrutlar və deklarativ keçidlərlə müasir naviqasiya API-si.
  • Modifier — sinif irsiliyi olmadan view-ların görünüşünü və davranışını konfiqurasiya etmək üçün çağırışlar zənciri.

SwiftUI nədir?

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.

SwiftUI-nin çoxplatformalılığı

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.

View Protocol və görünüşün gövdəsi

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.

swift
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 və şərti ifadələ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.

Vəziyyətin idarə edilməsi: @State, @Binding, @ObservedObject

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.

swift
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 və valideyn-uşaq əlaqəsi

@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.

swift
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 Naviqasiyası

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)).

View Modifier — görünüşün konfiqurasiyası

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.

Şərti modifierlər və animasiya

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 vs UIKit: yanaşmaların müqayisəsi

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.

AspektSwiftUIUIKit
YanaşmaDeklarativ: nə göstərməkİmperativ: necə qurmaq
VəziyyətProperty Wrappers, avtomatik yenidən çəkməƏl ilə: reloadData, setNeedsLayout
UI koduYığcam, modifier zəncirləriHəcmli, NSCoder/Storyboard/konstraintlər
PerformansiOS 17+ yüksək, diff alqoritmiiOS 12–16 pik, birbaşa nəzarət
Minimal versiyaiOS 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

Bir layihədə SwiftUI və UIKit birlikdə istifadə edilə bilərmi?

Bəli, UIHostingController (SwiftUI UIKit-də) və UIViewRepresentable (UIKit SwiftUI-də) vasitəsilə. Bu, miqrasiya zamanı məşhur olan hibrid yanaşmadır.

SwiftUI-də layihəyə hansı iOS versiyasından başlamaq lazımdır?

iOS 17 — tam funksionallıq: NavigationStack, Observation framework, Swift Charts. iOS 15 — istehsal üçün minimal hədd.

Niyə SwiftUI bəzən interfeysi yeniləmir?

Ə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.

SwiftUI-də gecikmə ilə düymə basılmasını necə idarə etmək olar?

.debounce Combine vasitəsilə istifadə edin: Button.publisher(for: .tap) .debounce(for: .seconds(0.3), scheduler: RunLoop.main).

SwiftUI xüsusi jestləri dəstəkləyirmi?

Bəli, Gesture modifierləri vasitəsilə: DragGesture, LongPressGesture, MagnificationGesture, RotationGesture. Onları .simultaneousGesture() və .sequenced() ilə birləşdirin.

Nəticə

  • SwiftUI — Apple-ın deklarativ freymvorku, burada interfeys vəziyyətin idarə edilməsi üçün property wrappers ilə View strukturlarının kompozisiyası şəklində təsvir edilir.
  • View Protocol computed property body ilə — hər view üçün yeganə giriş nöqtəsi. ViewBuilder 10-a qədər view-ı lazımsız konteynerlər olmadan birinə yığır.
  • @State, @Binding@ObservedObject məlumat idarəetmənin bütün ssenarilərini əhatə edir: lokal vəziyyət, valideyn-uşaq əlaqəsi və xarici modellər.
  • NavigationStack tip-təhlükəsiz enum marşrutları ilə NavigationView-i əvəz etdi, dərin keçidlər və proqram naviqasiyası dəstəyi əlavə etdi.
  • Modifier — SwiftUI-nin əsas nümunəsi, irsiliyə ehtiyac olmadan view-ların görünüşünü çağırışlar zənciri ilə konfiqurasiya etməyə imkan verir.
  • SwiftUI və UIKit UIHostingController və UIViewRepresentable vasitəsilə birlikdə mövcuddur, layihənin tədricən miqrasiyasına imkan verir.
  • iOS 17+ üçün Apple SwiftUI-ni əsas freymvork kimi tövsiyə edir; UIKit mürəkkəb xüsusi interfeyslər və köhnə versiyaların dəstəyi üçün qalır.

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.

Layihəni müzakirə et

Həm də oxuyun