Published on

Swiftda Equatable

Authors

Swiftda Equatable β€” bu ikki obyektni == operatori yordamida solishtirish imkonini beruvchi protocol.

Equatable protocolini ishlatish uchun avval turni (struct, class va hokazo) Equatable protocoliga moslashtirish kerak. Masalan,

struct Employee: Equatable {
  ...
}  

Bu yerda Employee structini Equatable protocoliga moslashtirdik.

Endi Employee dan instancelar yaratganimizda, protocol instancelarni == operatori yordamida solishtirish imkonini beradi.

Misol:

struct Employee: Equatable {
  var name: String     // ism
}

let obj1 = Employee(name: "Sabby")
let obj2 = Employee(name: "Smith")

// obj1 va obj2 ni solishtirish
if obj1 == obj2 {
    print("obj1 va obj2 teng")
}
else {
    print("obj1 va obj2 teng emas")
}

Natija:

obj1 va obj2 teng emas

Bu yerda obj1 == obj2 kodi false natijasini beradi, chunki obj1 va obj2 ning name propertysi uchun turli qiymatlarga ega. Shuning uchun else bloki bajariladi.

Equatable protocol yordamida Instancelarni solishtirish

// Employee ni Equatable ga moslashtirish
struct Employee: Equatable {
    
    var name: String     // ism
    var salary: Int      // maosh
}

// turli property qiymatlari bilan ikkita obyekt yaratish 
let obj1 = Employee(name: "Sabby", salary: 40000)
let obj2 = Employee(name: "Sabby", salary: 40000)
let obj3 = Employee(name: "Cathy", salary: 30000)

// obj1 va obj2 ni solishtirish
if obj1 == obj2 {
    print("obj1 va obj2 teng")
}
else {
    print("obj1 va obj2 teng emas")
}

// obj1 va obj3 ni solishtirish
if obj1 == obj3 {
    print("obj1 va obj3 teng")
}
else {
    print("obj1 va obj3 teng emas")
}

Natija:

obj1 va obj2 teng
obj1 va obj3 teng emas

Yuqoridagi misolda Employee structidan uchta obyekt yaratdik: obj1, obj2 va obj3.

Bu yerda obj1 == obj2 kodi true qiymatini qaytaradi, chunki ikkala obyekt ham name va salary propertylari uchun bir xil qiymatlarga ega.

Xuddi shunday, obj1 == obj3 kodi false qiymatini qaytaradi, chunki ikkala obyekt ham name va salary propertylari uchun turli qiymatlarga ega.

Equatable funksiya

Yuqoridagi misolda structning barcha propertylarini solishtirib chiqdik.

Ammo ba'zan turning faqat ayrim propertylarini solishtirishni xohlashimiz mumkin. Bunday holatda tur ichida equatable funksiyasidan foydalanishimiz mumkin. Masalan,

static func == (lhs: Employee, rhs: Employee) -> Bool {
    return lhs.salary == rhs.salary 
}

Bu yerda lhs.salary == rhs.salary ikki berilgan obyektning faqat salary propertyini solishtiradi.

Equatable funksiyadan foydalanish

struct Employee: Equatable {
    
  var name: String     // ism
  var salary: Int      // maosh

  // faqat salary propertyni solishtirish uchun equatable funksiyasini yaratish         
  static func == (lhs: Employee, rhs: Employee) -> Bool {
    return lhs.salary == rhs.salary 
  }
}

// name property uchun turli qiymatlarga ega ikkita obyekt yaratish 
let obj1 = Employee(name: "Sabby", salary: 34000)
let obj2 = Employee(name: "Cathy", salary: 34000)

// obj1 va obj2 ni solishtirish
if obj1 == obj2 {
  print("obj1 va obj2 teng")
}
else {
  print("obj1 va obj2 teng emas")
}

Natija:

obj1 va obj2 teng

Yuqoridagi misolda ikki instanceni salary propertysi asosida solishtirish uchun ==() funksiyasidan foydalandik:

static func == (lhs: Employee, rhs: Employee) -> Bool {
    return lhs.salary == rhs.salary 
}

Bu yerda obj1 va obj2 ning salary si bir xil, shuning uchun if bloki bajariladi.

Agar salary uchun turli qiymat bersak, else bloki bajarilgan bo'lar edi.

Equatable va Hashable

  • Equatable β€” obyektlarni == operatori yordamida solishtirish imkonini beradi
  • Hashable β€” obyektlarga hash qiymatlarini beradi va Set, Dictionary kabi kolleksiyalarda ishlatiladi

Hashable protocoli Equatable protocolidan meros oladi, ya'ni Hashable protocoliga mos keladigan har qanday tur avtomatik ravishda Equatable protocoliga ham mos keladi.

Xulosa

Equatable protocoli:

  • Obyektlarni == operatori bilan solishtirish imkonini beradi
  • Custom solishtirish mantig'ini yaratish imkonini beradi
  • Kod o'qishli va tushunarli bo'lishiga yordam beradi
  • Ko'plab Swift standart kutubxona turlarida qo'llaniladi