Class — Swift tilida mos yozuvlar turi (reference type) bo'lib, uning nusxalari tayinlashda ko'chirilmaydi, balki mos yozuv orqali uzatiladi. Strukturalardan farqli o'laroq, sinflar meros olish, deinitsializatsiya va xotirani boshqarish uchun avtomatik mos yozuvlarni hisoblash ARCni qo'llab-quvvatlaydi. Swift Programming Language Guide, 2026 ma'lumotlariga ko'ra, class Apple UI freymvorklari (UIKit, AppKit) bilan ishlash va ob'ektning umumiy identikligini talab qiladigan naqshlarni amalga oshirish uchun zarur. Class va struct o'rtasidagi tanlov Swift-dagi asosiy arxitektura qarorlaridan biridir.
Asosiy jihatlar
Class (sinf) — Swift-da xususiyatlar va metodlarni meros va dinamik jo'natish qo'llab-quvvatlashi bilan bir butunlikda guruhlaydigan murakkab mos yozuv turidir. Structdan farqli o'laroq, sinf nusxasi to'pda (heap) yaratiladi va o'zgaruvchi bu nusxaga mos yozuvni saqlaydi, o'z ma'lumotlarini emas.
Sinf o'zgaruvchisini boshqa o'zgaruvchiga tayinlaganingizda, ikkalasi xotirada bir xil ob'ektga ishora qiladi. Bir mos yozuv orqali qilingan o'zgarishlar ikkinchisi orqali ko'rinadi — bu delegatsiya, kuzatish va umumiy holat naqshlarida ishlatiladigan reference types-ning asosiy xususiyatidir.
Apple Swift Documentation ma'lumotlariga ko'ra, sinflar UIKit va AppKit bilan ishlashning yagona usuli bo'lib, unda barcha UI komponentlari UIView va UIViewController dan meros oladi. Bundan tashqari, sinflar ob'ekt identikligi (bir ob'ektga ikki mos yozuv) va boshqariladigan hayot davrini talab qiladigan naqshlarni amalga oshirish uchun zarurdir.
Reference type semantikasi — sinflarning asosiy xususiyatidir. Sinfni yangi o'zgaruvchiga tayinlashda Swift mos yozuvni ko'chiradi, ma'lumotlarni emas. Bir nusxaga ishora qiluvchi barcha o'zgaruvchilar uning joriy holatini ko'radi va uni o'zgartirishi mumkin. Bu xatti-harakat har bir o'zgaruvchi mustaqil nusxa oladigan value types-dan tubdan farq qiladi.
// Reference type semantikasi namunasi
class User {
var name: String
init(name: String) { self.name = name }
}
let user1 = User(name: "Alice")
let user2 = user1 // user2 — bir xil mos yozuv
user2.name = "Bob"
print(user1.name) // "Bob" — user2 orqali o'zgartirildi!
// === operatori bilan identiklikni tekshirish
print(user1 === user2) // true — bir xil ob'ekt
=== (identiklik) va !== operatorlari ikki o'zgaruvchining bir sinf nusxasiga ishora qilishini tekshiradi. Bu xususiyatlar qiymatlarini taqqoslaydigan == (tenglik) dan farq qiladi. Struct uchun === operatori mavjud emas — value types identiklikka ega emas.
Meros — sinf ota-sinfning xususiyatlari va metodlarini o'zlashtira oladigan mexanizmdir. Swift-da sinf faqat bitta ota-onadan meros olishi mumkin (single inheritance), lekin bir nechta protokollarni amalga oshirishi mumkin. override kalit so'zi meros olingan metod yoki xususiyatni qayta belgilashga imkon beradi.
Boshqa sinfdan meros olmagan har bir sinf avtomatik ravishda baza sinfi bo'ladi (NSObject bilan adashtirmang). Ost sinf nomidan keyin ikki nuqta bilan ota-onani ko'rsatadi. Agar ost sinf ota-onaning metodini qayta belgilasa, ota-onaning xatti-harakatini saqlash uchun super.metod() ni chaqirishi kerak — bu kompilyator talabidir.
final kalit so'zi class dan oldin meros olishni taqiqlaydi. Kompilyator final sinf metodlarining chaqiruvlarini static dispatch orqali optimallashtirishi mumkin, bu esa samaradorlikni oshiradi. Kengaytirish uchun mo'ljallanmagan sinflar uchun final dan foydalaning — bu niyatingizni hujjatlashtiradi va kodni tezlashtiradi.
// Swift-da sinf merosi namunasi
class Vehicle {
var speed: Double = 0
func description() -> String {
"Speed: \(speed) km/h"
}
}
// Car Vehicle dan meros oladi
class Car: Vehicle {
var brand: String = "Unknown"
override func description() -> String {
"\(brand) - \(speed) km/h"
}
}
// Final class — merosni taqiqlaydi
final class ElectricCar: Car {
var batteryLevel: Double = 100
}
let tesla = ElectricCar()
tesla.brand = "Tesla"
tesla.speed = 120
print(tesla.description()) // "Tesla - 120.0 km/h"
Sinf merosi kuchli, ammo mas'uliyatli mexanizmdir. Chuqur iyerarxiya (5+ daraja) kodni qo'llab-quvvatlash va sinashni qiyinlashtiradi. Merossiz funksionallikni qayta ishlatish uchun protokollardan extension va protokolga yo'naltirilgan dasturlash bilan foydalaning — Apple bu yondashuvni chuqur sinf iyerarxiyalariga alternativ sifatida targ'ib qiladi.
Swift sinflarning xotirasini boshqarish uchun ARC (Automatic Reference Counting) dan foydalanadi. Har bir sinf nusxasining kuchli mos yozuvlar hisoblagichi bor. Yangi kuchli mos yozuv yaratilganda hisoblagich ortadi; yo'q qilinganda kamayadi. Hisoblagich nolga yetganda xotira bo'shatiladi.
Deinit — sinf nusxasi bo'shatilishidan oldin avtomatik chaqiriladigan metoddir. Unda resurslar bo'shatiladi: fayllar yopiladi, bildirishnomalardan chiqiladi, taymerlar to'xtatiladi. Deinit faqat sinflarda mavjud — strukturalar va sanab o'tishlarda u yo'q.
Kuchli mos yozuv sikllarining (retain cycles) oldini olish uchun Swift weak va unowned mos yozuvlarini taqdim etadi. Weak — ob'ekt bo'shatilganda avtomatik nil bo'ladigan ixtiyoriy mos yozuv. Unowned — ixtiyoriy bo'lmagan, lekin joriy kontekstdan uzoqroq yashashi kafolatlangan ob'ektga ishora qiladi. Odatdagi retain cycle parent-child munosabatida yuzaga keladi: child ota-onaga kuchli mos yozuv saqlaydi.
// ARC va kuchsiz mos yozuv namunasi
class Parent {
var name: String
var child: Child?
init(name: String) { self.name = name }
deinit { print("\(name) dealokatsiya qilindi") }
}
class Child {
var name: String
weak var parent: Parent? // weak retain cycle ning oldini oladi
init(name: String) { self.name = name }
deinit { print("\(name) dealokatsiya qilindi") }
}
var parent: Parent? = Parent(name: "Anna")
parent?.child = Child(name: "Mia")
parent?.child?.parent = parent
parent = nil // Ikkala ob'ekt ham dealokatsiya qilindi!
// Weak bo'lmasa retain cycle yuzaga kelardi
Bola ob'ektdan ota-onaga bo'lgan mos yozuvlar va yopilmalardagi capture ro'yxatlari uchun har doim weak dan foydalaning. Unowned ni faqat ob'ekt joriy kontekstdan uzoqroq yashashiga ishonchingiz komil bo'lganda ishlating — unowned ni noto'g'ri ishlatish bo'shatilgan xotiraga murojaat qilishda crashga olib kelishi mumkin.
Class va struct o'rtasidagi tanlov samaradorlik, ip xavfsizligi va API dizayniga ta'sir qiladigan arxitektura qaroridir. Har bir aniq holatda to'g'ri qaror qabul qilishga yordam beradigan asosiy farqlar jadvalini ko'rib chiqamiz.
| Xususiyat | class | struct |
|---|---|---|
| Tur | Reference type (mos yozuv) | Value type (nusxa) |
| Xotira | Heap + ARC | Stack / inline |
| Meros | Qo'llab-quvvatlaydi (bitta ota-ona) | Qo'llab-quvvatlamaydi |
| Deinit | Bor | Yo'q |
| Identiklik (===) | Qo'llab-quvvatlaydi | Qo'llab-quvvatlamaydi |
| Mutating | Talab qilinmaydi (har doim mutating) | Faqat mutating bilan |
| Memberwise init | Yaratilmaydi | Avtomatik yaratiladi |
| Ip xavfsizligi | Kafolatlanmagan (umumiy holat) | Kafolatlangan (nusxalash) |
Sinflarni umumiy identiklik (kodning bir necha qismi bitta ob'ekt bilan ishlaydi), meros yoki Objective-C runtime bilan o'zaro aloqa kerak bo'lganda ishlating. Qolgan hamma narsa uchun strukturalar afzal — ular tezroq, ko'p ipli kodda xavfsizroq va xotira boshqaruvini talab qilmaydi.
Apple-ning standart sifatida struct dan foydalanish tavsiyasiga qaramay, sinflar bir necha aniq stsenariylarda zarurdir. Har birini amaliy misollar bilan ko'rib chiqamiz.
iOS va macOS-dagi barcha UI komponentlari UIView (iOS) yoki NSView (macOS) dan meros oladigan sinflardir. UIViewController ni struct bilan almashtira olmaysiz — u meros va resurslarni bo'shatish uchun deinitni talab qiladi. UIKit bilan ishlashda kontrollerlar, viewlar va ularning delegatlari uchun sinflardan foydalaning.
Singleton namunasi (butun ilova uchun bitta sinf nusxasi) mos yozuv semantikasini talab qiladi. Menejerlar: NetworkManager, SettingsManager, AnalyticsService — odatda shared static property bilan sinflar sifatida amalga oshiriladi. Strukturalar mos kelmaydi, chunki har bir nusxa mustaqil nusxa bo'ladi.
Ob'ekt yagona haqiqat manbai (single source of truth) bo'lishi va modullar o'rtasida mos yozuv orqali uzatilishi kerak bo'lganda — class dan foydalaning. Bu ob'ektning bir joyda o'zgartirilishi barcha bog'liq komponentlarda ko'rinishi kerak bo'lgan holat boshqaruviga tegishli. SwiftUI-dagi ObservableObject uchun sinflar majburiydir.
// ObservableObject — SwiftUI uchun class talab qilinadi
import SwiftUI
class AppViewModel: ObservableObject {
@Published var isLoggedIn: Bool = false
@Published var username: String = ""
func login(user: String) {
isLoggedIn = true
username = user
}
}
// SwiftUI View da ishlatish
struct ContentView: View {
@StateObject var viewModel = AppViewModel()
var body: some View {
Text(viewModel.isLoggedIn ? "Xush kelibsiz" : "Kirish")
}
}
Qoida: agar ob'ekt identiklikka (ikki mos yozuv -> bitta ob'ekt) ega bo'lishi kerak bo'lsa, yagona nusxa bo'lishi kerak bo'lsa yoki UIKit/Objective-C bilan ishlashi kerak bo'lsa — class ni tanlang. Agar ob'ekt shunchaki ma'lumot saqlasa — struct ni tanlang.
Ko'p beriladigan savollar
Class — Swift-da meros, deinitsializatsiya va xotirani boshqarish uchun ARCni qo'llab-quvvatlaydigan mos yozuv turi (reference type). Sinf nusxalari to'pda saqlanadi, o'zgaruvchilar esa ob'ektga mos yozuvni o'z ichiga oladi, uning nusxasini emas.
Class — reference type (mos yozuv orqali uzatiladi), meros va deinitni qo'llab-quvvatlaydi. Struct — value type (nusxalanadi), merosni qo'llab-quvvatlamaydi, lekin protokollarni amalga oshiradi va memberwise initni avtomatik oladi. Swift standart tip sifatida structni tavsiya qiladi.
ARC (Automatic Reference Counting) — Swift sinflari uchun xotira boshqarish mexanizmi. Har bir nusxaning kuchli mos yozuvlar hisoblagichi bor. Hisoblagich nolga tushganda xotira bo'shatiladi. Weak va unowned mos yozuvlari ob'ektlar o'rtasidagi kuchli mos yozuv sikllarining oldini oladi.
Deinit — xotirasi bo'shatilishidan oldin avtomatik chaqiriladigan sinf metodi. Fayllarni yopish, bildirishnomalardan chiqish va boshqa yakuniy operatsiyalar uchun ishlatiladi. Deinit faqat sinflarda mavjud — strukturalarda u yo'q.
Class ni UIKit/AppKit UI komponentlari, singleton, SwiftUI-dagi ObservableObject, umumiy identiklikka ega ob'ektlar (delegate, observer) va Objective-C runtime bilan ishlashda ishlating. Ma'lumot modellari, DTO va konfiguratsiyalar uchun struct afzal.
Xulosa
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.