Struct — Swift tilida qiymat-turi (value type) bo'lib, uning nusxalari kod qismlari o'rtasida uzatilganda ko'chiriladi. Klasslardan farqli o'laroq, strukturalar meros olishni qo'llab-quvvatlamaydi, lekin protokollarni amalga oshiradi, xususiyat va metodlarni o'z ichiga oladi va ARCsiz bashorat qilinadigan xotira boshqaruvini ta'minlaydi. Swift Programming Language Guide, 2026-ga ko'ra, struct Swift-ning asosiy qurilish blokidir — hatto standart Int, String, Array va Dictionary turlari strukturalar sifatida amalga oshirilgan. Til ma'lumotlarni modellashtirish uchun strukturalarni ustuvor tanlov sifatida tavsiya qiladi.
Asosiy fikrlar
Struct (struktura) — Swift-da bog'liq xususiyat va metodlarni yagona mavjudotda guruhlaydigan murakkab ma'lumot turidir. Klasslardan farqli o'laroq, strukturalar value types hisoblanadi: funksiyaga uzatilganda yoki yangi o'zgaruvchiga tayinlanganda strukturaning mustaqil nusxasi yaratiladi, original ob'ektga havola emas.
Swift barcha primitiv turlar uchun strukturalardan foydalanadi: Int, Double, String, Bool, Array, Dictionary va Set. Bu hatto asosiy Int soni ham struktur kabi harakat qilishini anglatadi — tayinlashda nusxa yaratiladi. Dasturchi o'zining ixtiyoriy xususiyat va metodlar to'plamiga ega strukturasini belgilashi mumkin.
Swift Evolution (SE-0143)-ga ko'ra, standart turlarni strukturalar sifatida amalga oshirish qarori ishlash va bashorat qilish bilan asoslangan. Value types havola silsilalarini yaratmaydi, ARC havola hisoblashni talab qilmaydi va nusxaning o'zgarishi originalga ta'sir qilmasligiga kafolat beradi — bu ko'p tarmoqli stsenariylarda ma'lumotlarning o'zgarmasligi uchun juda muhimdir.
Value type semantics — struct va class o'rtasidagi asosiy farqdir. Strukturani yangi o'zgaruvchiga tayinlaganingizda yoki funksiyaga uzatganingizda, Swift barcha ma'lumotlarning mustaqil nusxasini yaratadi. Nusxadagi har qanday o'zgarish originalga ta'sir qilmaydi, bu havola turlariga xos bo'lgan yon ta'sirlarni bartaraf qiladi.
// Value type semantikasi namunasi
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2 p1-ning mustaqil nusxasi
p2.x = 99 // Faqat p2 o'zgaradi
print(p1.x) // 10 — p1 o'zgarmas
print(p2.x) // 99
Swift nusxalashni optimallashtirish uchun Copy-on-Write (COW) dan foydalanadi. Agar bir nechta o'zgaruvchilar bitta strukturaga havola qilsa, lekin hech biri ma'lumotlarni o'zgartirmasa, haqiqiy nusxalash sodir bo'lmaydi. Swift birinchi mutatsiyagacha o'zgaruvchilar o'rtasida xotirani taqsimlaydi — keyin haqiqiy nusxa yaratiladi. Bu keraksiz ajratish operatsiyalarining oldini oladi va kollektsiyalar bilan ishlashni tezlashtiradi.
Odatiy bo'lib, struktura metodlari uning xususiyatlarini o'zgartira olmaydi — Swift o'zgartirishlar kiritadigan metodlar uchun aniq mutating ko'rsatilishini talab qiladi. Bu cheklov tasodifiy mutatsiyadan himoya qiladi va kodni bashorat qilinadigan qiladi: agar metod mutating sifatida belgilanmagan bo'lsa, siz strukturani o'zgartirmasligingiz kafolatlanadi.
Metoddan oldin mutating kalit so'zini qo'shganingizda, Swift struktura xususiyatlariga yangi qiymatlarni yozish imkoniyatiga ega bo'ladi. Aslida, metod hatto self = orqali struktura namunasini butunlay yangisi bilan almashtirishi mumkin. Bu mexanizm, masalan, Option va Result turlarida qo'llaniladi.
// Mutating metodi bilan struct
struct Counter {
private var value: Int = 0
// Mutating metodi — xususiyatlarni o'zgartirishi mumkin
mutating func increment() {
value += 1
}
// Mutating metodi self-ni butunlay almashtirishi mumkin
mutating func reset() {
self = Counter()
}
// Non-mutating metodi — faqat o'qish uchun
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Mutating qoidalari: struktura var orqali e'lon qilinishi kerak, let orqali emas — doimiy strukturada mutating metodini chaqirib bo'lmaydi. Kompilyator buni qurish bosqichida tekshiradi: let doimiysida mutating metodini chaqirish urinishi kompilyatsiya xatosiga olib keladi.
Struct va class o'rtasidagi tanlov — Swift-dagi asosiy qarorlardan biridir. Ikkala tur xususiyatlar, metodlar, boshlang'ichlar va protokollarni amalga oshirishi mumkin, ammo xotira semantikasi, meros va hayot aylanishini boshqarishda tub farqlarga ega.
| Xususiyat | struct | class |
|---|---|---|
| Tur | Value type (nusxalanadi) | Reference type (havola) |
| Meros | Qo'llab-quvvatlamaydi | Qo'llab-quvvatlaydi |
| ARC / havola hisoblash | Talab qilinmaydi | ARC talab qilinadi |
| Deinitsializatsiya | Qo'llab-quvvatlamaydi | deinit qo'llab-quvvatlaydi |
| Doimiyda xususiyatlarni o'zgartirish | Faqat var orqali | let orqali mumkin (havola doimiy) |
| Tur o'tkazish | Qo'llab-quvvatlamaydi | Qo'llab-quvvatlaydi |
| Kollektsiyalarda saqlash | To'g'ridan-to'g'ri saqlanadi (qiymat) | Havola sifatida saqlanadi (ko'rsatgich) |
Strukturalar ma'lumotlar meros talab qilmaganda, umumiy identifikatorga ega bo'lmasligi kerak bo'lganda (masalan, koordinatalar, o'lchamlar, konfiguratsiya) va modullar o'rtasida uzatilganda afzal. Klasslar UI komponentlari (UIView, UIViewController), singleton va umumiy identifikatorli ob'ektlar uchun tanlanadi.
Apple Swift-da ma'lumotlarni modellashtirish uchun struct-dan odatiy tur sifatida foydalanishni tavsiya qiladi. Strukturalar bashorat qilinadigan nusxa olish semantikasi va havola hisoblashning qo'shimcha yuki yo'qligi tufayli ko'pchilik stsenariylar uchun mos keladi. Oddiy holatlarni ko'rib chiqaylik.
Agar mavjudot meros ehtiyojisiz ma'lumotlarni o'z ichiga olsa (Product, User, Order, Point), struct dan foydalaning. Kompilyator avtomatik ravishda memberwise initializer yaratadi — init-ni qo'lda yozish shart emas. Equatable va Hashable ham barcha xususiyatlari ushbu protokollarga mos keladigan strukturalar uchun avtomatik amalga oshiriladi.
Yaratilgandan keyin o'zgarmaydigan konfiguratsiyalar, sozlamalar va bayroqlar uchun struct class-dan afzal. Doimiy (let) struktura barcha ichki maydonlarning o'zgarmasligini kafolatlaydi — class-da bu faqat havolaga tegishli, ob'ekt mazmuniga emas.
Strukturalar value semantics tufayli ko'p tarmoqli muhitda xavfsizdir. Har bir oqim mustaqil ma'lumot nusxasini oladi va boshqa oqimlarga ta'sir qilmaydi. Ma'lumot poygasi oqimlar o'rtasida value types uchun mumkin emas, bu struct-ni SwiftUI-dagi modellar uchun afzal tanlov qiladi (ObservableObject class talab qiladi, lekin @State struct dan foydalanadi).
// Struct-dan ma'lumot modeli uchun foydalanish namunasi
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// Computed xususiyati — non-mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// Avtomatik memberwise boshlang'ich
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// Nusxalash ko'p tarmoqlilik uchun xavfsiz
var userCopy = user
userCopy.isPremium = false
// user.isPremium true bo'lib qoladi
Class-dan meros (UIKit/AppKit komponentlari), umumiy identifikator (delegate, observer) yoki boshqariladigan ob'ekt hayot aylanishi (deinit) kerak bo'lganda foydalaning. Qolgan hamma narsa uchun — struct.
Tez-tez so'raladigan savollar
Struct Swift-da — kod qismlari o'rtasida uzatilganda nusxalanadigan qiymat-turidir (value type). Strukturalar xususiyatlar, metodlar, boshlang'ichlarni o'z ichiga olishi va protokollarni amalga oshirishi mumkin. Swift-ning asosiy turlari (Int, String, Array) strukturalar sifatida amalga oshirilgan.
Struct — value type (tayinlashda nusxalanadi), merosni qo'llab-quvvatlamaydi va ARC talab qilmaydi. Class — reference type (havola orqali uzatiladi), meros, deinitsializatsiya va havola hisoblashni qo'llab-quvvatlaydi. Dasturchilar struct-ni odatiy tur sifatida tavsiya qiladi.
Mutating — struktura metodining uning xususiyatlarini o'zgartirishi mumkinligini ko'rsatadigan kalit so'z. Mutating bo'lmasa, kompilyator maydonlarni o'zgartirishni taqiqlaydi. Mutating metodlari faqat var orqali e'lon qilingan o'zgaruvchilarda chaqirilishi mumkin, let da emas.
Copy-on-Write (COW) — Swift-da strukturalar uchun optimallashtiruv bo'lib, unda ma'lumotlarning haqiqiy nusxalanishi birinchi mutatsiya vaqtigacha kechiktiriladi. Barcha o'zgaruvchilar strukturani faqat o'qiyotganda, ular bitta xotira maydonini taqsimlaydi. Bu katta kollektsiyalar bilan ishlashda ishlashni oshiradi.
Struct-dan merossiz ma'lumot modellari, konfiguratsiyalar, DTO va ko'p tarmoqli stsenariylar uchun foydalaning. Class-dan UIKit/AppKit UI komponentlari, singleton, umumiy identifikatorli mavjudotlar (delegate, observer) va deinitsializatsiya talab qiladigan ob'ektlar uchun foydalaning.
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.