Swift-da Associated Values: bu nima, sintaksis va misollar

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

Associated Values — Swift mexanizmi, har bir enum variantiga alohida ixtiyoriy ma'lumotlarni biriktirish imkonini beradi. Raw values-dan farqli o'laroq, barcha case-lar bir xil turdagi qiymatlarga ega, associated values esa har bir case uchun tur va miqdor jihatidan farq qilishi mumkin. Apple Documentation, 2026 ma'lumotiga ko'ra, bu qo'shimcha o'rash turlarini yaratmasdan sohani aniq modellashtirish uchun asosiy imkoniyatdir.

Asosiy ma'lumotlar

  • Associated Values — enum case-ga biriktirilgan individual ma'lumotlar
  • Turlari associated values har bir case uchun farq qilishi mumkin
  • Olish switch yoki if case da qiymatlarni bog'lash orqali amalga oshiriladi
  • O'zaro istisno — associated values raw values bilan mos kelmaydi
  • Amaliyot — xatolar, so'rov natijalari va UI holatlarini modellashtirish

Associated Values nima?

Associated Values — bu enum case o'zi bilan birga saqlashi mumkin bo'lgan qo'shimcha ma'lumotdir. Raw values-dan farqli o'laroq, ular e'lon darajasida belgilangan, associated values esa enum namunasi yaratilganda o'rnatiladi.

To'lov usulini modellashtirishni tasavvur qiling: creditCard case-i oxirgi 4 ta raqam va amal qilish muddatini saqlashi mumkin, applePay casei esa — hech narsa. Associated values bilan bu pastki sinflar yoki ixtiyoriy maydonlarsiz tabiiy ravishda amalga oshiriladi.

Apple hujjatlariga ko'ra, associated values enum-ni oddiy doimiylar to'plamidan funksional tillarga xos bo'lgan algebraik ma'lumot turiga (sum type) aylantiradi. Bu kodning ifodaliligini sezilarli darajada oshiradi.

Associated values sintaksisi

Associated values case-dan keyin dumaloq qavslar ichida, funksiyalardagi kabi parametr nomlari va turlari ko'rsatilgan holda e'lon qilinadi.

swift
enum MediaFile {
    case image(width: Int, height: Int, format: String)
    case video(duration: Double, codec: String)
    case audio(bitrate: Int)
    case unknown
}

Namuna yaratilganda associated values argumentlar sifatida uzatiladi:

swift
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")

Swift associated values soni yoki turlariga hech qanday cheklov qo'ymaydi. Siz generics, yopilish funksiyalari va boshqa enum-larni associated values ichida ishlatishingiz mumkin. Bu murakkab ichki-ichiga joylashgan tuzilmalarni qurish imkonini beradi.

Associated values parametr nomlari namuna yaratilganda argument yorliqlari sifatida ishlatiladi — bu kodning o'qilishini yaxshilaydi. Switch orqali olishda nomlar hujjat sifatida xizmat qiladi, har bir qiymatning ma'nosini tushuntiradi. Bunday yondashuv kodni o'zini-o'zi hujjatlashtiradigan qiladi va ma'lumotlarni moslashtirishda xatolik ehtimolini kamaytiradi. Bu, ayniqsa, katta iOS ilovalarini jamoa bo'lib ishlab chiqishda qimmatlidir.

Associated values bilan Switch

Switch — associated values olishning asosiy usuli. Qiymatlar let yoki var orqali doimiylar yoki o'zgaruvchilarga bog'lanadi.

swift
func describe(_ file: MediaFile) -> String {
    switch file {
    case .image(let w, let h, let fmt):
        return "Image \(w)x\(h) .\(fmt)"
    case .video(let duration, let codec):
        return "Video \(duration)s, \(codec)"
    case .audio(let bitrate):
        return "Audio \(bitrate)kbps"
    case .unknown:
        return "Unknown format"
    }
}

Swift qisman moslashtirishni qo'llab-quvvatlaydi — associated values ning aniq qiymatlarini ko'rsatish mumkin:

swift
switch file {
case .image(let w, let h, "png"):
    print("PNG tasvir \(w)x\(h)")
case .image(1920, 1080, _):
    print("Full HD tasvir")
default:
    break
}

Wildcard (_) ishlatish keraksiz associated values-larni e'tiborsiz qoldirishga, case-lardagi doimiylar esa aniq qiymatlar bilan moslikni tekshirishga imkon beradi.

Associated Values vs Raw Values

Ko'plab boshlang'ich dasturchilar associated values ni raw values bilan aralashtirishadi. Bular turli qo'llanish stsenariylariga ega bo'lgan turli mexanizmlardir.

XususiyatRaw ValuesAssociated Values
Ma'lumot turiBarcha case-lar uchun bir turHar bir case uchun turli turlar
Belgilash momentiEnum e'lon qilingandaNamuna yaratilganda
MajburiylikBarcha case-lar qiymatga egaBa'zi case-lar qiymatsiz bo'lishi mumkin
MoslikO'zaro istisno — bir vaqtning o'zida ishlatib bo'lmaydi

Swift Evolution ga ko'ra, associated values Swift 2.0 da enum-ni qayta loyihalashning bir qismi sifatida kiritilgan. Ular turlarga algebraik yondashuvni ta'minlaydi, bunda har bir case o'z imzosiga ega bo'lgan alohida konstruktordir.

Associated values amaliy misollari

Associated values haqiqiy iOS loyihalarida faol qo'llaniladi. Uchta odatiy stsenariyni ko'rib chiqamiz.

API javoblarini modellashtirish

swift
enum APIResponse<T: Codable> {
    case success(data: T, cached: Bool)
    case failure(error: Error, retryAvailable: Bool)
    case loading(progress: Double)
}

UI State Machine

swift
enum ViewState<T> {
    case idle
    case loading(message: String)
    case loaded(data: T)
    case error(message: String, retryAction: () -> Void)
}

Associated values bilan enum kuchli vositaga aylanadi chekli avtomatlar uchun: har bir case — holat, associated values — bu holatning parametrlari. Kompilyator barcha o'tishlarning ishlanganligini kafolatlaydi.

if case va guard case orqali olish

Switchsiz bitta case-ni tekshirish uchun if case yoki guard case dan foydalaning. Bu faqat bitta variantni qayta ishlash kerak bo'lganda ixchamroqdir.

swift
let error = NetworkError.timeout(seconds: 30)

if case .timeout(let seconds) = error {
    print("So'rov \(seconds)s dan keyin vaqti tugadi")
}

guard case .httpError(let code, _) = error else {
    return
}
print("\(code) kodi bilan HTTP xatosi")

Tez-tez beriladigan savollar

Enum parametrsiz associated valuesga ega bo'lishi mumkinmi?

Ha, case associated valuesga ega bo'lmasligi mumkin — masalan, case unknown. Bunday case-lar qo'shimcha ma'lumotlarsiz oddiy enum case-lari kabi harakat qiladi. Bu marker holatlari uchun qulaydir.

Associated valuesga ega ikkita enum-ni qanday solishtirish mumkin?

Swift associated valuesga ega enum uchun Equatable ni avtomatik yaratmaydi (Swift 4.2+ gacha). Equatable ning aniq implementatsiyasini qo'shing yoki har bir case-ni navbatma-navbat solishtirish uchun switch dan foydalaning.

Associated values rekursiv enum-larda ishlatilishi mumkinmi?

Ha, indirect enum-dagi associated values — daraxtlar va bog'langan ro'yxatlarni qurish uchun standart usuldir. Case indirect belgisi bilan bir xil turdagi associated value ga ega bo'lishi mumkin.

Associated values struct-dagi ixtiyoriy xususiyatlardan qanday farq qiladi?

Associated values tip xavfsizdir — har bir case faqat o'z ma'lumotlariga ega. Ixtiyoriy maydonlari bo'lgan struct-da har bir namuna barcha maydonlarni o'z ichiga oladi va nil uchun runtime tekshiruvlari talab qilinadi.

Associated values Codable ni qo'llab-quvvatlaydimi?

Swift associated valuesga ega enum uchun Codable ni avtomatik yaratmaydi. Custom coding keys yordamida case-lar bo'yicha switch orqali encode va decode ning qo'lda implementatsiyasi talab qilinadi.

Xulosa

  • Associated Values — har bir enum case-ga turli ma'lumotlarni biriktirish mexanizmi
  • Sintaksis — case-dan keyin qavslar ichida parametrlarni e'lon qilish, funksiyalardagi kabi
  • Olish let-bog'lash bilan switch yoki if case orqali
  • Mos kelmaydi raw values bilan — ulardan birini ishlating
  • Generics associated values ichida enum-ni universal konteynerga aylantiradi
  • State Machine — iOS-da associated values uchun odatiy stsenariy

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