struct — bu nima, asosiy tushunchalar va Swift-da sintaksis

Muallif: IT Sectr Nashr etilgan: 2026-06-17 O'qish vaqti: 7 daq

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 — Swift-da qiymat-turi bo'lib, tayinlashda nusxalanadi va qiymat bo'yicha uzatiladi, havola orqali emas.
  • Copy-on-Write — optimallashtirish, bunda ma'lumotlarning haqiqiy nusxalanishi faqat qiymat o'zgarganda sodir bo'ladi, tayinlashda emas.
  • Mutating — strukturaning xususiyatlarini o'zgartiruvchi metodlar uchun talab qilinadigan kalit so'z.
  • Protokollar — strukturalar merossiz moslashuvchanlikni ta'minlaydigan protokollar va kengaytmalarni amalga oshirishi mumkin.
  • Xavfsizlik — havola silsilalarining yo'qligi strukturalarni ko'p tarmoqli kod va ma'lumot modellari uchun afzal qiladi.

Swift-da struct nima?

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.

Struct value type sifatida

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.

swift
// 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

Copy-on-Write optimallashtiruvi

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.

O'zgaruvchanlik va mutating metodlari

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.

Mutating harakatda

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.

swift
// 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 vs Class: taqqoslash

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.

Xususiyatstructclass
TurValue type (nusxalanadi)Reference type (havola)
MerosQo'llab-quvvatlamaydiQo'llab-quvvatlaydi
ARC / havola hisoblashTalab qilinmaydiARC talab qilinadi
DeinitsializatsiyaQo'llab-quvvatlamaydideinit qo'llab-quvvatlaydi
Doimiyda xususiyatlarni o'zgartirishFaqat var orqalilet orqali mumkin (havola doimiy)
Tur o'tkazishQo'llab-quvvatlamaydiQo'llab-quvvatlaydi
Kollektsiyalarda saqlashTo'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.

Qachon struct tanlash

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.

Merossiz ma'lumot modellari

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.

O'zgarmas (immutable) ma'lumotlar

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.

Ko'p tarmoqli kod

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).

swift
// 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

Swift-da struct nima?

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.

Swift-da struct va class o'rtasidagi farq nima?

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.

Swift struct-da mutating nima?

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.

Swift-da Copy-on-Write nima?

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.

Swift-da qachon struct va qachon class ishlatish kerak?

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

  • Struct — Swift-da qiymat-turi (value type) bo'lib, tayinlashda nusxalanadi, nusxalar o'rtasida yon ta'sirlarsiz bashorat qilinadigan xatti-harakatni ta'minlaydi.
  • Copy-on-Write strukturalarning ishlashini optimallashtiradi — haqiqiy nusxalash faqat birinchi mutatsiyada sodir bo'ladi, har bir tayinlashda emas.
  • Swift standart turlari — Int, String, Array, Dictionary — strukturalar sifatida amalga oshirilgan, bu barcha asosiy operatsiyalar uchun value semantics-ni kafolatlaydi.
  • Mutating — struktura xususiyatlarini o'zgartiruvchi metodlar uchun majburiy kalit so'z; chaqirish faqat var namunalarida mumkin.
  • Strukturalar merosni qo'llab-quvvatlamaydi, lekin protokollarni amalga oshiradi va funksionallik qo'shish uchun kengaytmalardan foydalanishi mumkin.
  • Equatable va Hashable barcha xususiyatlari ushbu protokollarga mos keladigan strukturalar uchun avtomatik amalga oshiriladi — bu taqqoslashni va kollektsiyalarda foydalanishni soddalashtiradi.
  • Apple struct-ni odatiy tur sifatida tavsiya qiladi — class-dan faqat meros, umumiy identifikator yoki boshqariladigan ob'ekt hayot aylanishi kerak bo'lganda foydalaning.

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