SwiftUI — asosiy tushunchalar, View, State va Data Flow

Muallif: IT Sectr Nashr etilgan: 2026-02-21 O'qish vaqti: 8 daq

SwiftUI — Apple ekotizimining barcha platformalarida foydalanuvchi interfeyslarini yaratish uchun deklarativ framework, WWDC 2019 da taqdim etilgan. Imperativ UIKit va uning viewDidLoad hamda qo'lda ekran yangilashidan farqli o'laroq, SwiftUI UI ni View protokoliga mos keladigan oddiy strukturalar to'plami sifatida tasvirlaydi. Swift.org (2025) ma'lumotiga ko'ra, SwiftUI App Store'da nashr etilgan yangi loyihalarning 65 foizida qo'llaniladi. Framework State va Data Flow mexanizmi orqali interfeys yangilanishini avtomatik boshqaradi — ma'lumot o'zgarganda View qo'lda reloadData chaqirmasdan qayta chiziladi.

Asosiy fikrlar

  • SwiftUI — UI uchun Apple deklarativ frameworki (2019), interfeys View protokoliga mos strukturalar bilan tasvirlanadi.
  • View — SwiftUI ning asosiy qurilish bloki; har bir View computed property body orqali ekranning o'z qismini tasvirlaydi.
  • @State — lokal holatni saqlash uchun property wrapper, o'zgarganda View avtomatik qayta chiziladi.
  • @Binding — View va ma'lumotlar o'rtasida ikki tomonlama bog'lanish, bola View ga ota holatini o'zgartirishga imkon beradi.
  • @ObservedObject va @StateObject — ObservableObject protokoliga mos sinflar orqali tashqi ma'lumot modellari bilan bog'lanish.

SwiftUI nima?

SwiftUI — Apple ning UIKit dan tubdan farq qiladigan deklarativ UI frameworki. Kontrollerlar, ko'rinishlar yaratish va ularning hayot siklini qo'lda boshqarish o'rniga, dasturchi interfeysni deklaratsiyalar shaklida tavsiflaydi: ekranda nima bo'lishi kerak, uni qanday qurish emas. SwiftUI reaktivlik prinsipiga asoslanadi: interfeys holatning funksiyasidir. Holat (State) o'zgarganda SwiftUI avtomatik ravishda barcha bog'liq View larning body sini qayta hisoblaydi va faqat o'zgargan ekran qismlarini yangilaydi. SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ va visionOS 1+ da mavjud. SwiftUI kodi platformalararo: bir fayl minimal platforma moslashuvlari bilan iPhone, iPad, Mac va Apple Watch da ishlaydi. Apple WWDC Session 101 (2024) ma'lumotiga ko'ra, SwiftUI App Store ning standart UI namunalarining 90 foizdan ko'prog'ini qamrab oladi.

SwiftUI vs UIKit

UIKit — imperativ framework (2008): dasturchi UIViewController yaratadi, viewDidLoad da subviews ni konfiguratsiya qiladi, UITableView uchun delegate/datasource ni amalga oshiradi va ekranni reloadData yoki setNeedsLayout orqali yangilaydi. SwiftUI kontrollerlarni oddiy View strukturalari bilan, delegatlarni — binding va onChange bilan, Auto Layout ni — HStack/VStack/ZStack va modifierlar (padding, frame, offset) bilan almashtiradi. UIKit ARC orqali qo'lda xotira boshqaruvini talab qiladi; SwiftUI — referans hisoblashni talab qilmaydigan strukturalar. SwiftUI ning ishlash unumdorligi UIKit bilan solishtirish mumkin: framework minimal o'zgarishlar to'plami uchun diffing algoritmidan foydalanadi. IT Sectr da SwiftUI iOS 17+ maqsadli yangi loyihalar uchun ishlatiladi; iOS 14-15 qo'llab-quvvatlanadigan loyihalar SwiftUI ning cheklangan mosligi sababli UIKit ni talab qiladi.

SwiftUI ning deklarativ sintaksisi

SwiftUI da interfeys ViewBuilder orqali tasvirlanadi — View lar to'plamini tuple yoki Group ga aylantiruvchi result builder. Modifierlar (.padding(), .font(), .foregroundColor()) asl obyektni mutatsiya qilmasdan o'zgartirilgan sozlamalar bilan yangi View yaratadi. Har bir modifier yangi View qaytaradi, bu esa zanjirlash imkonini beradi. ViewBuilder if/else, switch, ForEach ni qo'llab-quvvatlaydi — shartli va sikl ko'rinishlarni alohida kontrollerlarsiz. SwiftUI da View value type (struct) dir, bu oldindan bashorat qilinadigan xatti-harakatni kafolatlaydi va race conditions larni bartaraf qiladi.

View protokoli va computed property body

View — yagona talabga ega protokol: some View tipidagi computed property body. View ga mos keladigan har bir struktur o'zining ekran qismini body da tasvirlaydi. Some View — qaytarilgan View ning aniq turini yashiradigan opaque return type (VStack, HStack, ZStack, Text, Image va hokazo kombinatsiyasi). Swift kompilyatori aniq turni kompilyatsiya bosqichida chiqaradi, turni o'chirmasdan to'g'ridan-to'g'ri chaqiruv unumdorligini saqlaydi.

swift
import SwiftUI

struct GreetingView: View {
    var name: String
    
    var body: some View {
        VStack(spacing: 12) {
            Text("Salom, \(name)!")
                .font(.largeTitle)
                .foregroundColor(.primary)
            
            Text("SwiftUI ga xush kelibsiz")
                .font(.body)
                .foregroundColor(.secondary)
        }
        .padding()
        .background(
            RoundedRectangle(cornerRadius: 12)
                .fill(.ultraThinMaterial)
        )
    }
}

GreetingView strukturasi name parametrini qabul qiladi va vertikal stackda ikkita matn blokini ko'rsatadi. .font, .foregroundColor, .padding va .background modifierlari tashqi ko'rinishni konfiguratsiya qiladi. SwiftUI body ni kiritish parametrlari (name) har safar o'zgarganda chaqiradi — qayta chizish faqat o'zgargan qismlar uchun sodir bo'ladi. Misolda RoundedRectangle .ultraThinMaterial bilan ishlatilgan — SwiftUI ga o'rnatilgan mahalliy blur foni.

@State: SwiftUI da lokal holat

@State — bitta View ga tegishli lokal holatni e'lon qiladigan property wrapper. SwiftUI State xotirasini avtomatik boshqaradi: qiymat o'zgarganda body qayta chiziladi, lekin faqat ushbu State dan foydalanadigan View lar uchun. State oddiy turlar (String, Int, Bool, enum) uchun haqiqat manbai (source of truth) dir. Murakkab ma'lumot modellari uchun @State ni ishlatmang — ular uchun @StateObject va @ObservedObject mo'ljallangan. State private bo'lishi va View ning o'zida saqlanishi kerak, komponentlar o'rtasida uzatilmasligi kerak.

swift
import SwiftUI

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

Boshlang'ich qiymat count = 0. Tugmaning har bir bosilishi count ni oshiradi; SwiftUI avtomatik ravishda CounterView ni to'liq (barcha View larni) qayta chizadi. UIKit da o'xshash stsenariy IBOutlet, IBAction va label.text ni qo'lda yangilashni talab qilgan bo'lardi. @State View faqat aniq State o'zgarganda qayta chizilishini kafolatlaydi — SwiftUI ning diffing algoritmi daraxtda minimal o'zgarishlarni topadi.

@Binding: View lar o'rtasida ikki tomonlama bog'lanish

@Binding — View va u boshqarmaydigan ma'lumotlar o'rtasida ikki tomonlama bog'lanish yaratadigan property wrapper. Binding State ga (yoki boshqa haqiqat manbai ga) havola bo'lib, bola View ga otada saqlangan qiymatni o'qish va o'zgartirish imkonini beradi. Binding $ prefiksi bilan belgilanadi: $count bola View ga Binding<Int> uzatadi. Binding bo'lmasa, bola View ota ma'lumotlarini o'zgartira olmaydi — faqat o'qiy oladi.

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 ga ega va Binding ni $quantity orqali uzatadi. StepperControl value ni o'zgartira oladi va otadagi quantity avtomatik sinxronlashadi. Binding ma'lumotlarning nusxasi emas, balki haqiqat manbai ga ko'prikdir. Otaning ma'lumotlarini o'zgartirishi kerak bo'lgan maxsus boshqaruvlar, muharrirlar va qayta foydalaniladigan komponentlar uchun @Binding dan foydalaning.

@ObservedObject va @StateObject: tashqi ma'lumot modellari

@StateObject — ObservableObject ga mos sinf namunasini yaratish va egalik qilish uchun property wrapper. View obyektni hayot siklida bir marta yaratadi va uning @Published xususiyatlari o'zgarganda qayta chiziladi. @ObservedObject — o'xshash wrapper, lekin View obyektga ega emas — obyekt View dan tashqarida yaratiladi va saqlanadi (initsializator orqali uzatiladi). Apple View iyerarxiyasida haqiqat manbai uchun @StateObject ni va bog'liqliklarni in'ektsiya qilish uchun @ObservedObject ni tavsiya qiladi.

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("Xush kelibsiz, \(settings.username)!")
                    .font(.headline)
            }
        }
        .padding()
    }
}

UserSettings — ikkita @Published xususiyatiga ega ObservableObject. ProfileView @StateObject orqali obyektga egalik qiladi. username yoki isLoggedIn o'zgarishi ProfileView ni avtomatik qayta chizadi. @Published SwiftUI ga o'zgarishlar haqida xabar berish uchun Combine Publisher dan foydalanadi. Settings ni bola View larga uzatish uchun @ObservedObject dan foydalaning:

SwiftUI da Data Flow: to'liq rasm

Apple SwiftUI da to'rt darajali Data Flow ni belgilaydi: @State (lokal, value type), @Binding (ikki tomonlama), @StateObject/@ObservedObject (ObservableObject bilan reference type), @EnvironmentObject (global, muhit orqali in'ektsiya). EnvironmentObject ma'lumotlarni initsializatorda aniq uzatmasdan butun View iyerarxiyasi bo'ylab uzatish imkonini beradi. Qo'shimcha ravishda @AppStorage UserDefaults bilan, @SceneStorage — sahna holati bilan, @FetchRequest — Core Data bilan ishlaydi. Data Flow darajasini tanlash ilova arxitekturasini belgilaydi: oddiy ekranlar State/Binding, modulli — ObservedObject, keng ko'lamli — EnvironmentObject + Redux ga o'xshash yechimlar (TCA, Composable Architecture) dan foydalanadi.

Property WrapperEgalikTurQachon ishlatish
@StateLokalValue (struct, enum)Bir View ning oddiy holati (sanoqchi, toggle, matn maydoni)
@BindingTashqiState ga havolaOta ma'lumotlarini o'zgartiruvchi bola View
@StateObjectView egaligiReference (class)Murakkab ma'lumot modeli uchun haqiqat manbai
@ObservedObjectIn'ektsiyaReference (class)View tashqarisida yaratilgan model (init orqali uzatilgan)
@EnvironmentObjectGlobalReference (class)Butun iyerarxiya uchun ochiq ma'lumotlar (avtorizatsiya, mavzu)

Tez-tez beriladigan savollar

@State @StateObject dan qanday farq qiladi?

@State — value types (struct, enum, String, Int) va bir View ning lokal holati uchun. SwiftUI State xotirasini avtomatik boshqaradi. @StateObject — ObservableObject ga mos reference types (class) uchun. @StateObject obyektga egalik qiladi va @Published xususiyatlari o'zgarganda View ni qayta chizadi. Oddiy sanoqchilar uchun @State dan foydalaning; mantiqli modellar uchun — @StateObject.

SwiftUI ni UIKit bilan ishlatish mumkinmi?

Ha, SwiftUI UIKit bilan UIHostingController (UIKit ichida SwiftUI) va UIViewRepresentable (SwiftUI ichida UIKit) orqali integratsiyalanadi. UIHostingController SwiftUI View ni UIViewController ga o'raydi. UIViewRepresentable SwiftUI da UIKit komponentlaridan (MKMapView, WKWebView) foydalanish imkonini beradi. Bu UIKit dan SwiftUI ga migratsiya uchun standart yondashuvdir.

SwiftUI da ViewBuilder nima?

ViewBuilder — result builder (Swift 5.1), View lar to'plamini TupleView, Group yoki ConditionalContent tipidagi yagona qiymatga aylantiradi. ViewBuilder deklarativ body ichida imperativ if/else va switch yozish imkonini beradi. ViewBuilder bo'lmasa, har bir shartli blok uchun AnyView yoki Group qaytarish kerak bo'lardi. ViewBuilder body da View lar orasida vergul kerak bo'lmasligining sababidir.

SwiftUI barcha Apple qurilmalarida ishlaydimi?

Ha, SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ va visionOS 1+ ni qo'llab-quvvatlaydi. Biroq ba'zi API lar faqat yangi versiyalarda mavjud: masalan, navigationStack (iOS 16+), Observable macro (iOS 17+). Orqaga moslik uchun #available va UIKit moslashuvlaridan foydalaning.

SwiftUI ilovalarini qanday debug qilish kerak?

Xcode Debug View Hierarchy modifierlar va ramkalar bilan SwiftUI View daraxtini ko'rsatadi. SwiftUI Inspector asbobi (Xcode ning o'ng paneli) modifierlarni real vaqtda o'zgartirish imkonini beradi. self._printChanges() body da qayta chizish sabablarini log qiladi. Instruments SwiftUI shabloni bilan View unumdorligini kuzatadi va haddan tashqari qayta chizishlarni aniqlaydi.

Xulosa

  • SwiftUI — Apple ning UI uchun deklarativ frameworki, interfeys computed property body bilan View strukturalari bilan tasvirlanadi (2019).
  • View — View protokoliga mos value type (struct); body ViewBuilder orqali some View qaytaradi.
  • @State — value types uchun lokal holat; o'zgarganda View avtomatik qayta chiziladi.
  • @Binding — $ prefiksi orqali ikki tomonlama bog'lanish; bola View ota ma'lumotlarini o'zgartiradi.
  • @StateObject / @ObservedObject — ObservableObject va @Published xususiyatlari bilan reference types; StateObject obyektga egalik qiladi, ObservedObject tashqaridan qabul qiladi.
  • @EnvironmentObject — butun View iyerarxiyasi uchun global holat; .environmentObject() orqali in'ektsiya qilinadi.
  • Data Flow SwiftUI da — State (lokal) orqali Binding (ikki tomonlama) bilan ObservedObject (modulli) va EnvironmentObject (global) gacha.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing