Generic (umumiy dasturlash) — bu Swift mexanizmi bo'lib, turlar va funksiyalarni parametrlashgan tur
Asosiy fikrlar
Generic (umumiy tur) — bu turga qarab parametrlash bilan moslashuvchan, qayta foydalaniladigan kod yozish imkonini beradigan Swift sintaktik konstruksiyasidir. Aniq tur o'rniga burchakli qavslarda placeholder yoziladi — odatda
Genericsiz har bir tur uchun alohida funksiyalar yozish kerak bo'ladi: swapInts, swapStrings, swapDates. Generic swap funksiyasi uchala variantni bitta deklaratsiya bilan almashtiradi. Bu takrorlanishni kamaytiradi, o'qishni osonlashtiradi va kodni nusxalashda xatolik ehtimolini pasaytiradi.
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swapValues(&x, &y)
Swift kompilyatori genericning har bir aniq qo'llanilishi uchun ixtisoslashtirilgan kod yaratadi. Bu swapValues
Generic funksiyalar — bir yoki bir nechta tur-parametrlarni qabul qiladigan funksiyalardir. Tur-parametrlar funksiya nomidan keyin burchakli qavslarda ko'rsatiladi:
Funksiyada bir nechta generic parametr bo'lishi mumkin. Masalan, findKey
func findKey<K: Hashable, V>(
for value: V,
in dictionary: [K: V]
) -> K? where V: Equatable {
for (key, dictValue) in dictionary {
if dictValue == value {
return key
}
}
return nil
}
K: Hashable va where V: Equatable cheklovlari findKey faqat kalitlari xeshlanadigan va qiymatlari taqqoslanadigan lug'at bilan chaqirilishini kafolatlaydi. Bunday cheklovlar byurokratiya emas, balki zaruratdir: Hashablesiz kalit bo'yicha qidiruvni indekslash mumkin emas, Equatablesiz value ni dictValue bilan taqqoslab bo'lmaydi.
where — bu generic parametrlarga qo'shimcha cheklovlar qo'yadigan Swift kalit so'zidir. Burchakli qavslarda protokolni oddiy ko'rsatishdan (
Where bandi funksiya yoki turning imzosidan keyin, ochiluvchi figurali qavsdan oldin yoziladi. Where da T: Comparable & Hashable (bir vaqtning o'zida ikkita protokol) yoki T.U == Int (associated type konkretlashtirish) ko'rsatilishi mumkin.
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
}
extension Container where Item: Comparable {
func isSorted() -> Bool {
// Implementation available only if Item: Comparable
return true
}
}
Where bilan kengaytma faqat shartni qondiradigan turlar uchun metodlar qo'shadi. Container
Associated Types (bog'langan turlar) — bu e'lon qilish bosqichida aniq turni ko'rsatmasdan protokolni umumiy qilish usulidir.
Where yordamida turli protokollarning associated types o'rtasida bog'lanishlar o'rnatilishi mumkin. Masalan, bir protokolning Item i boshqasining Iterator.Element i bilan mos kelishi talab qilinishi mumkin. Bu kompilyatsiya darajasida turlarning mosligini kafolatlaydi.
protocol StackProtocol {
associatedtype Element
mutating func push(_ item: Element)
mutating func pop() -> Element?
}
struct IntStack: StackProtocol {
typealias Element = Int
private var items: [Int] = []
mutating func push(_ item: Int) { items.append(item) }
mutating func pop() -> Int? { items.popLast() }
}
IntStack typealias yordamida Element ni Int sifatida konkretlashtiradi. Kompilyator protokolning barcha talablari ushbu tur bilan bajarilishini tekshiradi. Associated types bo'lmasa, generic protokol bilan StackProtocol
Generic kengaytmalar qo'shimcha cheklovlar bilan generic turga metodlar qo'shish imkonini beradi. Bu “shartli muvofiqlik” naqshidir, bunda tur faqat ma'lum shartlarda funksionallik oladi. Subskriptlar ham generic bo'lishi mumkin.
Subskript umumiy bo'lishi mumkin: burchakli qavslarda generic parametrlarni qabul qiladi. Bu indeks har xil turlarda bo'lishi mumkin bo'lgan ixtiyoriy indeksli kolleksiyalarga xavfsiz kirish uchun foydalidir.
extension Array where Element: Numeric {
func sum() -> Element {
return reduce(0, +)
}
}
extension Array {
subscript<Indices: Sequence>(indices: Indices) -> [Element]
where Indices.Element == Int {
return indices.map { self[$0] }
}
}
Bunday konstruksiya kuchli kompozitsiya beradi: sum metodi faqat sonli massivlarda paydo bo'ladi, ixtiyoriy indekslar bilan subskript esa har qanday butun son indekslar ketma-ketligi bilan ishlaydi. Kompilyatorning o'zi where shartlariga asoslanib, bu a'zolarning ko'rinishini boshqaradi.
Xatolar generic dan foydalanishda ko'pincha noto'g'ri cheklovlar yoki aniq tur kerak bo'lgan joyda generic ishlatish urinishi bilan bog'liq. Dasturchilar duch keladigan uchta keng tarqalgan stsenariyni ko'rib chiqaylik.
Aniq tur yetarli bo'lgan joyda generic parametrlar qo'shish — anti-naqshdir. Agar funksiya har doim String bilan ishlasa, uni
Metod mavjudligini ko'rsatmasdan generic parametrda metodni chaqirish — xato.
// ❌ Error: value has no count method
func countElements<T>>(value: T) -> Int { value.count }
// ✅ Works: T: Collection guarantees count exists
func countElements<T: Collection>(value: T) -> Int { value.count }
Xato tushunarli: generic
Tez-tez beriladigan savollar
Generic — bu Int, String va boshqa turlar uchun bir xil mantiqni takrorlamasdan istalgan tur bilan ishlaydigan kod yozish usulidir. Aniq tur o'rniga foydalanish vaqtida haqiqiy tur bilan almashtiriladigan placeholder
Generic kompilyatsiya bosqichida aniq tur haqidagi ma'lumotni saqlaydi, bu kompilyatorga turlarni tekshirish va optimallashtirilgan kod yaratish imkonini beradi. Any — bu turni o'chirish: istalgan qiymat uzatilishi mumkin, ammo tur yo'qoladi va konvertatsiya (as?) talab qilinadi.
Burchakli qavslarda T: SomeProtocol sintaksisidan yoki alohida where T: SomeProtocol bandidan foydalaning. Cheklovlar generic parametrning ma'lum metodlar va xususiyatlarni qo'llab-quvvatlashini kafolatlaydi.
Associated Type (associatedtype) — protokol ichidagi tur uchun placeholderdir. Protokol aniq turni ko'rsatmaydi, balki associatedtype e'lon qiladi, u amalga oshirishda konkretlashtiriladi: Array Element ga, Dictionary Key va Value ga ega.
Swift generic kodni har bir aniq tur uchun ixtisoslashtirilgan versiyalarga kompilyatsiya qiladi. Amalda, Int uchun generic funksiya Int uchun qo'lda yozilgan funksiyadan sekin emas. Abstraksiya uchun qo'shimcha yuklama yo'q.
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.