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 — 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.
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-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 — 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.
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 — 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.
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 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.
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.
@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.
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:
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 Wrapper | Sahiblik | Tip | Nə vaxt istifadə etməli |
|---|---|---|---|
| @State | Lokal | Value (struct, enum) | Bir View-in sadə vəziyyəti (sayğac, toggle, mətn sahəsi) |
| @Binding | Xarici | State-ə istinad | Valideyn məlumatlarını dəyişən uşaq View |
| @StateObject | View-in sahibliyi | Reference (class) | Mürəkkəb məlumat modeli üçün source of truth |
| @ObservedObject | İnjectiya | Reference (class) | View xaricində yaradılmış model (init ilə ötürülür) |
| @EnvironmentObject | Qlobal | Reference (class) | Bütün iyerarxiyaya açıq məlumatlar (avtorizasiya, tema) |
Tez-tez verilən suallar
@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.
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.
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.
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.
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ə
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