- Published on
8.1 Swiftda Generics | Swift asoslari
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Generics nima?
Swift dasturlash tilida Generics — bu bir xil kodni turli xil ma’lumot turlari (Int, String, Double va boshqalar) bilan ishlatish imkoniyatini beruvchi kuchli vosita. Generics yordamida kod qisqaroq, tushunarliroq va qayta ishlatiladigan (reusable) bo‘ladi.
Generics ishlatmasdan yozilgan kod
func printIntArray(numbers: [Int]) {
for number in numbers {
print(number)
}
}
func printStringArray(strings: [String]) {
for str in strings {
print(str)
}
}
Bu kod faqat bitta turga ishlaydi (Int yoki String).
Generics bilan yozilgan kod
func printArray<T>(items: [T]) {
for item in items {
print(item)
}
}
printArray(items: [1, 2, 3]) // Int
printArray(items: ["a", "b", "c"]) // String
printArray(items: [1.5, 2.5, 3.5]) // Double
Bu yerda T — bu Generic Type Parameter. Swift keyinchalik Tni haqiqiy tur bilan almashtiradi.
Generics bilan Struct
struct Box<T> {
var item: T
}
let intBox = Box(item: 123) // T = Int
let stringBox = Box(item: "Hello") // T = String
intBoxichidaIntsaqlanadistringBoxichidaStringsaqlanadi
Generics bilan Protocols
Ba’zida biz generics’ni faqat bitta tur emas, balki ma’lum qoidalarga (protocols) mos keladigan turlar bilan ishlatishni xohlaymiz.
Misol: faqat Comparable bo‘lgan elementlar orasidan eng kattasini topish:
func findMax<T: Comparable>(array: [T]) -> T? {
return array.max()
}
findMax(array: [3, 7, 1]) // 7
findMax(array: ["a", "z", "m"]) // "z"
Bu yerda T: Comparable — demak T turi faqat Comparable protokoliga mos keladigan bo‘lishi kerak.
Generics bilan Extensions
Generics bilan yozilgan tur (masalan, Array, Box) ga qo‘shimcha imkoniyat berish uchun extension ishlatamiz.
extension Array {
func printAllElements() {
for element in self {
print(element)
}
}
}
[1, 2, 3].printAllElements()
["a", "b", "c"].printAllElements()
Endi har qanday Array chaqirilganda, u o‘z elementlarini chiqaradi.
Generics bilan Constraints (where)
where kalit so‘zi yordamida generics uchun yanada aniqroq shartlar qo‘yish mumkin.
func compareItems<T: Equatable>(a: T, b: T) where T: CustomStringConvertible {
if a == b {
print("Equal: \(a)")
} else {
print("Not equal: \(a) and \(b)")
}
}
compareItems(a: 5, b: 5) // Equal: 5
compareItems(a: "Hi", b: "Hello") // Not equal: Hi and Hello
Bu yerda shartlar:
Tprotokolga mos bo‘lishi kerak (Equatable)Tqo‘shimcha ravishdaCustomStringConvertiblebo‘lishi kerak
Xulosa
- Generics — universal kod yozish imkonini beradi.
- Protocols bilan ishlaganda, biz generiklarni faqat kerakli qoidalarga mos keladigan turlar bilan cheklaymiz.
- Extensions orqali mavjud generik turlarga yangi funksiyalar qo‘shamiz.
- Constraints (
where) esa aniqroq shartlar qo‘yishga yordam beradi.
Shu usullar orqali Swift kodimiz moslashuvchan, qayta ishlatiladigan va xavfsiz bo‘lib qoladi.
Topshiriqlar
1-topshiriq.
Generik funksiya yaratish Har qanday turdagi massivni qabul qiladigan generik funksiya yozing.
Funksiya massivning birinchi elementini qaytarsin.
Agar massiv bo‘sh bo‘lsa, nil qaytarsin.
Misol: [1, 2, 3] → 1, [] → nil.
2-topshiriq.
Generik struct yaratish Container nomli generik struct tuzing.
Uning ichida value nomli o‘zgaruvchi bo‘lsin.
Struct ichida printValue nomli funksiya yozing, u value qiymatini chop etsin.
Har xil turlarda (Int, String) sinab ko‘ring.
3-topshiriq.
Protocol bilan ishlash Summable nomli protokol yarating.
Bu protokol faqat + operatori ishlaydigan turlar uchun mo‘ljallansin.
Generik funksiya yozing, u Summable protokoliga mos keladigan ikkita qiymatni qo‘shsin.
Natijani ekranga chiqaring.
4-topshiriq.
Extension bilan kengaytirish Array uchun extension yozing.
Extension ichida barcha elementlarni vergul bilan ajratib chiqaradigan funksiya yarating.
Har xil turdagi massivlarda (masalan, Int, String) sinab ko‘ring.
5-topshiriq.
Constraints (where) bilan ishlash Generik funksiya yozing, u faqat Equatable bo‘lgan turlar bilan ishlasin.
Funksiya ikkita qiymatni taqqoslasin.
Agar ular teng bo‘lsa — “Teng”, aks holda — “Teng emas” deb chiqarsin.
Funksiya where kalit so‘zidan foydalansin.