SwiftUI — əsas anlayışlar, View, State və Data Flow

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

SwiftUI — Apple ekosisteminin bütün platformalarında istifadəçi interfeysləri qurmaq üçün deklarativ freymvork, WWDC 2019-da təqdim edilib. İmperativ UIKit və onun viewDidLoad və əl ilə ekran yeniləməsindən fərqli olaraq, SwiftUI UI-ni View protokoluna uyğun sadə strukturlar kolleksiyası kimi təsvir edir. Swift.org (2025) məlumatına görə, SwiftUI App Store-da dərc olunan yeni layihələrin 65%-ində istifadə olunur. Freymvork State və Data Flow mexanizmi vasitəsilə interfeysin yenilənməsini avtomatik idarə edir — məlumat dəyişdikdə View reloadData çağırmadan yenidən çəkilir.

Əsas məqamlar

  • SwiftUI — UI üçün Apple-ın deklarativ freymvorku (2019), interfeys View protokoluna uyğun strukturlarla təsvir olunur.
  • View — SwiftUI-nin əsas tikinti bloku; hər View computed property body vasitəsilə ekranın öz hissəsini təsvir edir.
  • @State — lokal vəziyyəti saxlamaq üçün property wrapper, dəyişdikdə View avtomatik yenidən çəkilir.
  • @Binding — View və məlumatlar arasında ikitərəfli əlaqə, uşaq View-in valideynin vəziyyətini dəyişməsinə imkan verir.
  • @ObservedObject və @StateObject — ObservableObject protokoluna uyğun siniflər vasitəsilə xarici məlumat modelləri ilə əlaqə.

SwiftUI nədir?

SwiftUI — Apple-ın UIKit-dən köklü şəkildə fərqlənən deklarativ UI freymvorku. Kontrollerlər, görünüşlər yaratmaq və onların həyat dövrünü əl ilə idarə etmək əvəzinə, proqramçı interfeysi deklarasiyalar şəklində təsvir edir: ekranda nə olmalıdır, necə qurulacağı deyil. SwiftUI reaktivlik prinsipinə əsaslanır: interfeys vəziyyətin funksiyasıdır. Vəziyyət (State) dəyişdikdə SwiftUI avtomatik olaraq bütün asılı View-lərin body-sini yenidən hesablayır və yalnız dəyişmiş ekran hissələrini yeniləyir. SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ və visionOS 1+ üçün əlçatandır. SwiftUI kodu çarpaz platformalıdır: bir fayl minimal platforma adaptasiyaları ilə iPhone, iPad, Mac və Apple Watch-da işləyir. Apple WWDC Session 101 (2024) məlumatına görə, SwiftUI App Store-un standart UI nümunələrinin 90%-dən çoxunu əhatə edir.

SwiftUI vs UIKit

UIKit — imperativ freymvork (2008): proqramçı UIViewController yaradır, viewDidLoad-da subviews konfiqurasiya edir, UITableView üçün delegate/datasource tətbiq edir və ekranı reloadData və ya setNeedsLayout ilə yeniləyir. SwiftUI kontrollerləri sadə View strukturları ilə, delegatları — binding və onChange ilə, Auto Layout-u — HStack/VStack/ZStack və modifierlərlə (padding, frame, offset) əvəz edir. UIKit ARC vasitəsilə əl ilə yaddaş idarəsi tələb edir; SwiftUI — istinad sayma tələb etməyən strukturlar. SwiftUI-nin performansı UIKit ilə müqayisə olunur: freymvork minimal dəyişiklik dəsti üçün diffing alqoritmindən istifadə edir. IT Sectr-də SwiftUI iOS 17+ hədəfi olan yeni layihələr üçün istifadə olunur; iOS 14-15 dəstəyi olan layihələr SwiftUI-nin məhdud uyğunluğu səbəbindən UIKit tələb edir.

SwiftUI-nin deklarativ sintaksisi

SwiftUI-də interfeys ViewBuilder vasitəsilə təsvir olunur — View dəstini tuple və ya Group-a çevirən result builder. Modifierlər (.padding(), .font(), .foregroundColor()) orijinal obyekti mutasiya etmədən dəyişdirilmiş parametrlərlə yeni View yaradır. Hər modifier yeni View qaytarır, bu da chaining-ə imkan verir. ViewBuilder if/else, switch, ForEach-i dəstəkləyir — şərti və dövri renderinq ayrı kontrollerlər olmadan. SwiftUI-də View value type (struct)-dır, bu proqnozlaşdırıla bilən davranışı təmin edir və race conditions-u aradan qaldırır.

View protokolu və computed property body

View — yeganə tələbi olan protokol: some View tipli computed property body. View-ə uyğun olan hər struktur öz ekran hissəsini body-də təsvir edir. Some View — qaytarılan View-in konkret tipini gizlədən opaque return type (VStack, HStack, ZStack, Text, Image və s. birləşmə). Swift kompilyatoru konkret tipi kompilyasiya mərhələsində çıxarır, tip silinmədən birbaşa çağırış performansını qoruyur.

swift
import SwiftUI

struct GreetingView: View {
    var name: String
    
    var body: some View {
        VStack(spacing: 12) {
            Text("Salam, \(name)!")
                .font(.largeTitle)
                .foregroundColor(.primary)
            
            Text("SwiftUI-ə xoş gəldiniz")
                .font(.body)
                .foregroundColor(.secondary)
        }
        .padding()
        .background(
            RoundedRectangle(cornerRadius: 12)
                .fill(.ultraThinMaterial)
        )
    }
}

GreetingView strukturu name parametrini qəbul edir və şaquli yığında iki mətn bloku göstərir. .font, .foregroundColor, .padding və .background modifierləri görünüşü konfiqurasiya edir. SwiftUI body-ni giriş parametrləri (name) hər dəfə dəyişdikdə çağırır — yenidən çəkmə yalnız dəyişmiş hissələr üçün baş verir. Nümunədə RoundedRectangle .ultraThinMaterial ilə istifadə olunub — SwiftUI-yə daxil olan nativ blur fon.

@State: SwiftUI-də lokal vəziyyət

@State — bir View-ə aid lokal vəziyyəti elan edən property wrapper. SwiftUI State-in yaddaşını avtomatik idarə edir: dəyər dəyişdikdə body yenidən çəkilir, ancaq yalnız bu State-dən istifadə edən View-lər üçün. State sadə tiplər (String, Int, Bool, enum) üçün məlumat mənbəyidir (source of truth). Mürəkkəb məlumat modelləri üçün @State istifadə etməyin — onlar üçün @StateObject və @ObservedObject nəzərdə tutulub. State private olmalı və View-in özündə saxlanmalı, komponentlər arasında ötürülməməlidir.

swift
import SwiftUI

struct CounterView: View {
    @State private var count = 0
    
    var body: some View {
        VStack(spacing: 20) {
            Text("Say: \(count)")
                .font(.system(size: 48, weight: .bold))
            
            Button(action: { count += 1 }) {
                Label("Artır", systemImage: "plus.circle")
            }
            .buttonStyle(.borderedProminent)
        }
        .padding()
    }
}

İlkin dəyər count = 0. Düymənin hər basılması count-u artırır; SwiftUI avtomatik olaraq CounterView-i tamamilə (bütün View-ləri) yenidən çəkir. UIKit-də analoji ssenari IBOutlet, IBAction və label.text-in əl ilə yenilənməsini tələb edərdi. @State View-in yalnız konkret State dəyişdikdə yenidən çəkilməsini təmin edir — SwiftUI-nin diffing alqoritmi ağacda minimal dəyişiklikləri tapır.

@Binding: View arasında ikitərəfli əlaqə

@Binding — View və onun idarə etmədiyi məlumatlar arasında ikitərəfli əlaqə yaradan property wrapper. Binding State-ə (və ya digər source of truth) istinaddır, uşaq View-ə valideyndə saxlanılan dəyəri oxumağa və dəyişməyə imkan verir. Binding $ prefiksi ilə işarələnir: $count uşaq View-ə Binding<Int> ötürür. Binding olmadan uşaq View valideynin məlumatlarını dəyişə bilməz — yalnız oxuya bilər.

swift
import SwiftUI

struct StepperControl: View {
    @Binding var value: Int
    let range: ClosedRange<Int>
    
    var body: some View {
        HStack {
            Button(action: { if value > range.lowerBound { value -= 1 } }) {
                Image(systemName: "minus.circle")
            }
            Text("\(value)")
                .frame(minWidth: 40)
            Button(action: { if value < range.upperBound { value += 1 } }) {
                Image(systemName: "plus.circle")
            }
        }
    }
}

struct ParentView: View {
    @State private var quantity = 5
    
    var body: some View {
        StepperControl(value: $quantity, range: 1...10)
    }
}

ParentView State quantity-yə sahibdir və Binding-i $quantity vasitəsilə ötürür. StepperControl value-nu dəyişə bilər və valideyndə quantity avtomatik sinxronlaşır. Binding məlumatın surəti deyil, həqiqət mənbəyinə körpüdür. Valideynin məlumatlarını dəyişməli olan xüsusi kontrollar, redaktorlar və təkrar istifadə olunan komponentlər üçün @Binding istifadə edin.

@ObservedObject və @StateObject: xarici məlumat modelləri

@StateObject — ObservableObject-ə uyğun sinfin nümunəsini yaratmaq və sahib olmaq üçün property wrapper. View obyekti həyat dövründə bir dəfə yaradır və onun @Published xassələri dəyişdikdə yenidən çəkilir. @ObservedObject — oxşar wrapper, lakin View obyektin sahibi deyil — obyekt View xaricində yaradılır və saxlanılır (inizializator vasitəsilə ötürülür). Apple View iyerarxiyasında source of truth üçün @StateObject, asılılıqların inject edilməsi üçün @ObservedObject tövsiyə edir.

swift
import SwiftUI
import Combine

class UserSettings: ObservableObject {
    @Published var username: String = "Guest"
    @Published var isLoggedIn = false
}

struct ProfileView: View {
    @StateObject private var settings = UserSettings()
    
    var body: some View {
        VStack {
            TextField("Username", text: $settings.username)
                .textFieldStyle(.roundedBorder)
            
            Toggle("Logged In", isOn: $settings.isLoggedIn)
            
            if settings.isLoggedIn {
                Text("Xoş gəldiniz, \(settings.username)!")
                    .font(.headline)
            }
        }
        .padding()
    }
}

UserSettings — iki @Published xassəsi olan ObservableObject. ProfileView @StateObject vasitəsilə obyektə sahibdir. username və ya isLoggedIn dəyişdikdə ProfileView avtomatik yenidən çəkilir. @Published SwiftUI-ə dəyişikliklər barədə məlumat vermək üçün Combine Publisher-dən istifadə edir. Settings-i uşaq View-lərə ötürmək üçün @ObservedObject istifadə edin:

SwiftUI-də Data Flow: tam mənzərə

Apple SwiftUI-də dörd Data Flow səviyyəsi müəyyən edir: @State (lokal, value type), @Binding (ikitərəfli), @StateObject/@ObservedObject (ObservableObject ilə reference type), @EnvironmentObject (qlobal, mühit vasitəsilə inject). EnvironmentObject məlumatları inicializatorda açıq ötürmədən bütün View iyerarxiyasına ötürməyə imkan verir. Əlavə olaraq @AppStorage UserDefaults ilə, @SceneStorage — səhnə vəziyyəti ilə, @FetchRequest — Core Data ilə işləyir. Data Flow səviyyəsinin seçimi tətbiqin arxitekturasını müəyyən edir: sadə ekranlar State/Binding, modul — ObservedObject, miqyaslı — EnvironmentObject + Redux bənzəri həllər (TCA, Composable Architecture) istifadə edir.

Property WrapperSahiblikTipNə vaxt istifadə etməli
@StateLokalValue (struct, enum)Bir View-in sadə vəziyyəti (sayğac, toggle, mətn sahəsi)
@BindingXariciState-ə istinadValideyn məlumatlarını dəyişən uşaq View
@StateObjectView-in sahibliyiReference (class)Mürəkkəb məlumat modeli üçün source of truth
@ObservedObjectİnjectiyaReference (class)View xaricində yaradılmış model (init ilə ötürülür)
@EnvironmentObjectQlobalReference (class)Bütün iyerarxiyaya açıq məlumatlar (avtorizasiya, tema)

Tez-tez verilən suallar

@State nə ilə fərqlənir @StateObject-dən?

@State — value types (struct, enum, String, Int) və bir View-in lokal vəziyyəti üçün. SwiftUI State-in yaddaşını avtomatik idarə edir. @StateObject — ObservableObject-ə uyğun reference types (class) üçün. @StateObject obyektə sahibdir və @Published xassələri dəyişdikdə View-i yenidən çəkir. Sadə sayğaclar üçün @State istifadə edin; məntiqli modellər üçün — @StateObject.

SwiftUI UIKit ilə istifadə edilə bilərmi?

Bəli, SwiftUI UIKit ilə UIHostingController (UIKit daxilində SwiftUI) və UIViewRepresentable (SwiftUI daxilində UIKit) vasitəsilə inteqrasiya olunur. UIHostingController SwiftUI View-i UIViewController-ə bürüyür. UIViewRepresentable SwiftUI-də UIKit komponentlərindən (MKMapView, WKWebView) istifadə etməyə imkan verir. Bu, UIKit-dən SwiftUI-ə miqrasiya üçün standart yanaşmadır.

SwiftUI-də ViewBuilder nədir?

ViewBuilder — result builder (Swift 5.1), View dəstini TupleView, Group və ya ConditionalContent tipli tək dəyərə çevirir. ViewBuilder deklarativ body daxilində imperativ if/else və switch yazmağa imkan verir. ViewBuilder olmadan hər şərti blok üçün AnyView və ya Group qaytarmaq lazım gələrdi. ViewBuilder body-də View-lər arasında vergül tələb olunmamasının səbəbidir.

SwiftUI bütün Apple cihazlarında işləyir?

Bəli, SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ və visionOS 1+ dəstəkləyir. Lakin bəzi API-lər yalnız yeni versiyalarda mövcuddur: məsələn, navigationStack (iOS 16+), Observable macro (iOS 17+). Geriyə uyğunluq üçün #available və UIKit adaptasiyalarından istifadə edin.

SwiftUI tətbiqlərini necə debug etməli?

Xcode Debug View Hierarchy modifierlər və çərçivələrlə SwiftUI View ağacını göstərir. SwiftUI Inspector aləti (Xcode-un sağ paneli) modifierləri real vaxtda dəyişməyə imkan verir. self._printChanges() body-də yenidən çəkmə səbəblərini log edir. Instruments SwiftUI şablonu ilə View performansını izləyir və həddindən artıq yenidən çəkmələri aşkarlayır.

Nəticə

  • SwiftUI — Apple-ın UI üçün deklarativ freymvorku, interfeys computed property body ilə View strukturları ilə təsvir olunur (2019).
  • View — View protokoluna uyğun value type (struct); body ViewBuilder vasitəsilə some View qaytarır.
  • @State — value types üçün lokal vəziyyət; dəyişdikdə View avtomatik yenidən çəkilir.
  • @Binding — $ prefiksi ilə ikitərəfli əlaqə; uşaq View valideynin məlumatlarını dəyişir.
  • @StateObject / @ObservedObject — ObservableObject və @Published xassələri ilə reference types; StateObject obyektə sahibdir, ObservedObject xaricdən qəbul edir.
  • @EnvironmentObject — bütün View iyerarxiyası üçün qlobal vəziyyət; .environmentObject() vasitəsilə inject olunur.
  • Data Flow SwiftUI-də — State (lokal) vasitəsilə Binding (ikitərəfli) ilə ObservedObject (modul) və EnvironmentObject (qlobal)-ə qədə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