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 — 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 case-dan keyin dumaloq qavslar ichida, funksiyalardagi kabi parametr nomlari va turlari ko'rsatilgan holda e'lon qilinadi.
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:
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.
Switch — associated values olishning asosiy usuli. Qiymatlar let yoki var orqali doimiylar yoki o'zgaruvchilarga bog'lanadi.
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:
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.
Ko'plab boshlang'ich dasturchilar associated values ni raw values bilan aralashtirishadi. Bular turli qo'llanish stsenariylariga ega bo'lgan turli mexanizmlardir.
| Xususiyat | Raw Values | Associated Values |
|---|---|---|
| Ma'lumot turi | Barcha case-lar uchun bir tur | Har bir case uchun turli turlar |
| Belgilash momenti | Enum e'lon qilinganda | Namuna yaratilganda |
| Majburiylik | Barcha case-lar qiymatga ega | Ba'zi case-lar qiymatsiz bo'lishi mumkin |
| Moslik | O'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 haqiqiy iOS loyihalarida faol qo'llaniladi. Uchta odatiy stsenariyni ko'rib chiqamiz.
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
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.
Switchsiz bitta case-ni tekshirish uchun if case yoki guard case dan foydalaning. Bu faqat bitta variantni qayta ishlash kerak bo'lganda ixchamroqdir.
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
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.
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.
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 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.
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
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.