- Published on
Swiftda Comparable
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Comparable protokoli
Comparable β ob'ektlarni tartiblash va solishtirish imkonini beradi. Int, String, Date kabi turlar tayyor Comparable. O'z turlaringizga ham qo'shishingiz mumkin.
Asosiy tushuncha
// βββββββββββββββββββββββββββββββββββββββ
// TAYYOR COMPARABLE TURLAR
// Int, Double, String, Date β hammasi Comparable
// βββββββββββββββββββββββββββββββββββββββ
let sonlar = [5, 2, 8, 1, 9]
let tartiblangan = sonlar.sorted() // [1, 2, 5, 8, 9]
let teskari = sonlar.sorted(by: >) // [9, 8, 5, 2, 1]
let ismlar = ["Vali", "Ali", "Gani"]
let alifbo = ismlar.sorted() // ["Ali", "Gani", "Vali"]
// min() va max() ham Comparable tufayli ishlaydi
let eng_kichik = sonlar.min()! // 1
let eng_katta = sonlar.max()! // 9
Custom Comparable β o'z turingizga qo'llash
// βββββββββββββββββββββββββββββββββββββββ
// O'Z STRUCT IGA COMPARABLE QO'SHISH
// βββββββββββββββββββββββββββββββββββββββ
struct Talaba: Comparable {
let ism: String
let baho: Double
// Equatable β teng bo'lishni aniqlash (Comparable talab qiladi)
static func == (lhs: Talaba, rhs: Talaba) -> Bool {
lhs.ism == rhs.ism && lhs.baho == rhs.baho
}
// Comparable β tartibni aniqlash
// Faqat < yozish yetarli β >, <=, >= avtomatik hosil bo'ladi
static func < (lhs: Talaba, rhs: Talaba) -> Bool {
// Bahosi bo'yicha tartiblash
lhs.baho < rhs.baho
}
}
let talabalar = [
Talaba(ism: "Ali", baho: 4.5),
Talaba(ism: "Vali", baho: 3.8),
Talaba(ism: "Gani", baho: 4.9),
]
// sorted() endi ishlaydi β Comparable bo'lgani uchun
let bahoBoyicha = talabalar.sorted()
// [Vali(3.8), Ali(4.5), Gani(4.9)]
// Teskari tartib
let engYaxshi = talabalar.sorted(by: >)
// [Gani(4.9), Ali(4.5), Vali(3.8)]
// min/max ishlaydi
let engPast = talabalar.min()! // Vali(3.8)
Bir nechta maydon bo'yicha tartiblash
struct Xodim: Comparable {
let ism: String
let yosh: Int
let maosh: Double
static func == (lhs: Xodim, rhs: Xodim) -> Bool {
lhs.ism == rhs.ism && lhs.yosh == rhs.yosh
}
static func < (lhs: Xodim, rhs: Xodim) -> Bool {
// Avval maosh bo'yicha, teng bo'lsa ism bo'yicha
if lhs.maosh != rhs.maosh {
return lhs.maosh < rhs.maosh
}
return lhs.ism < rhs.ism // alifbo tartibida
}
}
// sorted(by:) bilan bir nechta maydon
let xodimlar: [Xodim] = [/* ... */]
// Yosh bo'yicha, keyin ism bo'yicha
let tartiblangan = xodimlar.sorted {
if $0.yosh != $1.yosh { return $0.yosh < $1.yosh }
return $0.ism < $1.ism
}
Enum da Comparable
// βββββββββββββββββββββββββββββββββββββββ
// ENUM β case tartibi bo'yicha avtomatik Comparable
// βββββββββββββββββββββββββββββββββββββββ
enum Daraja: Comparable {
case boshlangich // 0
case orta // 1
case yuqori // 2
case ekspert // 3
}
// Solishtirish ishlaydi β case tartibi bo'yicha
let d1: Daraja = .boshlangich
let d2: Daraja = .ekspert
print(d1 < d2) // true β boshlangich < ekspert
print(d2 > d1) // true
let darajalar: [Daraja] = [.yuqori, .boshlangich, .ekspert, .orta]
let tartiblangan = darajalar.sorted()
// [.boshlangich, .orta, .yuqori, .ekspert]
π― Topshiriq
Kitob struct yarating: nomi: String, sahifaSoni: Int, narxi: Double. Comparable qo'llab, sahifa soni bo'yicha tartiblang. Keyin sorted(by:) bilan narxi bo'yicha teskari tartiblang. min() va max() bilan eng qisqa va eng uzun kitobni toping.