Published on

Swiftda Protocols

Authors

Swiftda protocol metodlar yoki propertylar rejasini belgilaydi, keyin esa bu reja classlar (yoki boshqa turlar) tomonidan qabul qilinishi mumkin.

protocol yaratish uchun protocol kalit so'zidan foydalanamiz. Masalan,

protocol Greet {

  // property rejasi 
  var name: String { get }

  // metod rejasi 
  func message() 
}

Bu yerda:

  • Greet — protocol nomi
  • name — o'qish mumkin bo'lgan property
  • message() — hech qanday implementatsiyasiz metod ta'rifi

Eslatmalar:

  • protocol faqat metod yoki property ta'rifini o'z ichiga oladi, ularning amaliy tanasini emas.
  • protocol property o'qish uchunmi yoki o'qish va yozish uchunmi ekanligini ko'rsatishi kerak.

Classni protocolga moslashtirish

Swiftda protocoldan foydalanish uchun boshqa classlar unga mos kelishi kerak. Classni protocolga moslashtirgandan so'ng, metodning amaliy implementatsiyasini ta'minlashimiz shart.

Classni protocolga moslashtirishning usuli:

// Employee classini Greet protocoliga moslashtirish
class Employee: Greet {

  // propertyning implementatsiyasi
  var name = "Perry"

  // metodning implementatsiyasi
  func message() {
    print("Xayrli tong!")
  }
}

Bu yerda Employee classini Greet protocoliga moslashtirdik. Shuning uchun name propertysi va message() metodining implementatsiyasini taqdim etishimiz kerak.

Misol:

protocol Greet {
  
  // property rejasi
  var name: String { get }

  // metod rejasi 
  func message() 
} 

// Employee classini Greet protocoliga moslashtirish
class Employee: Greet {

  // propertyning implementatsiyasi
  var name = "Perry"

  // metodning implementatsiyasi
  func message() {
    print("Xayrli tong", name)
  }
}

var employee1 = Employee()
employee1.message()

Natija:

Xayrli tong Perry

Yuqoridagi misolda Greet nomli protocol yaratdik. protocol name propertysi va message() metodi rejasini o'z ichiga oladi.

Bu yerda Employee classi Greet ga mos keladi va name hamda message() ning amaliy implementatsiyasini taqdim etadi.

Misol:

protocol Polygon {

  func getArea(length: Int, breadth: Int)
}

// Polygon protocoliga mos kelish
class Rectangle: Polygon {

  // metodning implementatsiyasi
  func getArea(length: Int, breadth: Int) {
    print("To'rtburchak yuzasi:", length * breadth)
  }
}

// obyekt yaratish
var r1 = Rectangle()

r1.getArea(length: 5, breadth: 6)

Natija:

To'rtburchak yuzasi: 30

Yuqoridagi misolda Polygon nomli protocol yaratdik. protocol ikki parametrli getArea() metodi rejasini o'z ichiga oladi: length va breadth.

Bu yerda Rectangle classi Polygon ga mos keladi va getArea() metodining amaliy implementatsiyasini taqdim etadi.

func getArea(length: Int, breadth: Int) {
  print("To'rtburchak yuzasi:", length * breadth)
}

Bir nechta protocollarga mos kelish

Swiftda class bir nechta protocollarga ham mos kelishi mumkin. Masalan,

protocol Sum {
  ...
}

protocol Multiplication {
  ...
}

class Calculate: Sum, Multiplication {
  ...
}

Bu yerda Calculate nomli class Sum va Multiplication protocollariga mos keladi.

Misol:

// Sum protocolini yaratish
protocol Sum {

  func addition()
}

// Multiplication protocolini yaratish
protocol Multiplication {

  func product()
}

// classni ikki protocolga moslashtirish
class Calculate: Sum, Multiplication {

  var num1 = 0     // birinchi son
  var num2 = 0     // ikkinchi son

  func addition() {
    let result1 = num1 + num2
    print("Yig'indi:", result1)
  }

  func product() {
    let result2 = num1 * num2
    print("Ko'paytma:", result2)
  }
}

// obyekt yaratish
var calc1 = Calculate()

// propertylarga qiymat berish
calc1.num1 = 5
calc1.num2 = 10

// metodlarga murojaat
calc1.addition()
calc1.product()

Natija:

Yig'indi: 15
Ko'paytma: 50

Yuqoridagi misolda ikki protocol yaratdik: Sum va Multiplication. Shuningdek, bu ikki protocolga mos keladigan Calculate nomli class yaratdik.

Sum va Multiplication protocollari ichida mos ravishda addition() va product() nomli metodlar rejasini yaratdik.

protocol Sum {

  func addition()
}

protocol Multiplication {

  func product()
}

Calculate classi Sum va Multiplication ga mos kelgani uchun class ichida addition() va product() metodlarining amaliy implementatsiyasini taqdim etdik.

Nihoyat, bu metodlarga classning calc1 obyekti yordamida murojaat qildik.

// metodlarga murojaat
calc1.addition()
calc1.product()

protocol Inheritance

Classlarga o'xshab, protocollar ham boshqa protocollardan meros olishi mumkin. Masalan,

protocol Car {
  ...
}

protocol Brand: Car {
  ...
}

Bu yerda Brand protocoli Car protocolidan meros oladi. Endi agar biror class Brand ni implementatsiya qilsa, u Car va Brand ning barcha propertylari uchun implementatsiya taqdim etishi kerak.

Misol:

protocol Car {
  var colorOptions: Int { get }     // rang variantlari
}

// Car protocolidan meros olish
protocol Brand: Car {
  var name: String { get }     // nomi
}

class Mercedes: Brand {

  // ikkala protocol propertylarini ham implementatsiya qilish kerak 
  var name: String = ""
  var colorOptions: Int = 0
}

var car1 = Mercedes()
car1.name = "Mercedes AMG"
car1.colorOptions = 4

print("Nomi:", car1.name)
print("Rang variantlari:", car1.colorOptions)

Natija:

Nomi: Mercedes AMG
Rang variantlari: 4

Yuqoridagi misolda Brand protocoli Car protocolidan meros oladi.

Bu yerda Mercedes classi faqat Brand ga mos keladi. Ammo Brand Car dan meros olgani uchun biz Car va Brand ning barcha propertylarini implementatsiya qilishimiz kerak.

Eslatma: protocol bir nechta protocollardan meros olishi mumkin. Masalan,

protocol A {
  ...
}
protocol B {
  ... 
}

protocol C: A, B {
  ...
}

protocol Extensions

Swiftda protocollarni extension kalit so'zi yordamida kengaytirishimiz mumkin. Masalan,

// protocol ta'rifi
protocol Brake {
  func applyBrake()
}

// Brake protocoliga mos keladigan class yaratish
class Car: Brake {
  var speed: Int = 0     // tezlik

  func applyBrake() {
    print("Tormoz bosildi")
  }
}

// protocolni kengaytirish
extension Brake {
  func stop() {
    print("Dvigatel to'xtatildi")
  }
}

let car1 = Car()
car1.speed = 61
print("Tezlik:", car1.speed)

car1.applyBrake()

// kengaytirilgan protocolga murojaat
car1.stop()

Natija:

Tezlik: 61
Tormoz bosildi
Dvigatel to'xtatildi

Yuqoridagi misolda applyBrake() funksiyasini belgilaydigan Brake protocolini yaratdik.

Biz Brake protocolini kengaytirib, uning ichida stop() funksiyasini e'lon qildik.

// protocolni kengaytirish
extension Brake {
  func stop() {
    print("Dvigatel to'xtatildi")
  }
}

Kengaytirilgan protocolga car1 obyekti yordamida murojaat qilishimiz mumkin.

// kengaytirilgan protocolga murojaat
car1.stop()