Published on

Swiftda Extension

Authors

Swiftda mavjud turlarga yangi funksionallik qo'shishimiz mumkin. Bunga extension yordamida erishishimiz mumkin.

Extension e'lon qilish uchun extension kalit so'zidan foydalanamiz. Masalan,

// class ta'rifi 
class Temperature {
  ...
}

// Temperature classining extension
extension Temperature {

  // yangi metodlar qo'shish 
} 

Bu yerda extension kalit so'zi yordamida Temperature classining kengaytmasini yaratdik.

Endi extension ichida Temperature ga yangi funksionallik qo'shishimiz mumkin.

Misol:

// class ta'rifi
class Temperature {
  var celsius: Double = 0     // selsiy

  func setTemperature(celsius: Double) {
    self.celsius = celsius
    print("Selsiy:", celsius)
  }
}

// extension e'lon qilish
extension Temperature {

  // Temperature classiga yangi metod qo'shish
  func convert() {
    var fahrenheit = (celsius * 1.8) + 32
    print("Farengeyt:", fahrenheit)
  }
}

// classni initsializatsiya qilish
let temp1 = Temperature()
temp1.setTemperature(celsius: 16)

// class obyekti yordamida extension metodiga murojaat
temp1.convert()

Natija:

Selsiy: 16.0
Farengeyt: 60.8

Yuqoridagi misolda Temperature classining kengaytmasini yaratdik.

extension Temperature {

  // Temperature classiga yangi metod qo'shish
  func convert() {
    var fahrenheit = (celsius * 1.8) + 32
    ...
  }
}

Bu extension Temperature ga quyidagi funksionalliklarni qo'shadi:

  • convert() β€” haroratni selsiydan farengeytga o'zgartiradigan metod
  • fahrenheit β€” konvertatsiya natijasini saqlaydigan convert() ichida e'lon qilingan o'zgaruvchi

Keyin Temperature ning temp1 nomli obyektini yaratdik va uni extension ichida yaratilgan metodga murojaat qilish uchun ishlatdik.

// class obyekti yordamida extension metodiga murojaat
temp1.convert()

Class ichida e'lon qilingan propertylar (celsius kabi) extensionda ham ishlatilishi mumkin.

Extensionda Computed property

Swiftda extensionlarga stored propertylar qo'sha olmaymiz. Masalan,

extension Circle {
  // stored property
  var radius: Int // xato kod
}

Ammo Swift extensionga computed property qo'shish imkonini beradi. Masalan,

extension Circle {

  // computed property
  var area: Double {
    ...
  }
}

Bu yerda area β€” extension tanasida e'lon qilingan computed property.

Misol:

class Circle {
  var radius: Double = 0     // radius
}

extension Circle {
  // computed property e'lon qilish 
  var area: Double {
    return 3.14 * radius * radius
  }
}

let circle1 = Circle()
circle1.radius = 5
print("Yuza:", circle1.area)

Natija:

Yuza: 78.5

Yuqoridagi misolda Circle classining extension ini yaratdik, bu yerda area nomli computed property e'lon qildik.

Bu property radius qiymatiga asoslanib doiraning yuzasini hisoblab beradi.

var area: Double {
  return 3.14 * radius * radius
}

Protocol Extension

Swiftda protocollarni ham kengaytirishimiz mumkin. Masalan,

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

// protocolni kengaytirish
extension Brake {
  func applyBrake() {
    print("Tormoz bosildi")
  }
}

// Brake protocoliga mos keladigan class e'lon qilish
class Car: Brake {
  var speed: Int = 0     // tezlik
}

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

// kengaytirilgan protocolga murojaat
car1.applyBrake()

Natija:

Tezlik: 61
Tormoz bosildi

Yuqoridagi misolda applyBrake() funksiyasini belgilaydigan Brake protocolini yaratdik.

Biz Brake protocolini kengaytirib, uning ichida applyBrake() funksiyasining tanasini e'lon qildik.

// protocolni kengaytirish
extension Brake {
  func applyBrake() {
    print("Tormoz bosildi")
  }
}

Endi Car classi Brake protocoliga mos kelgani uchun:

class Car: Brake {
  ...
}

car1 obyekti yordamida kengaytirilgan protocolga murojaat qilishimiz mumkin.

// kengaytirilgan protocolga murojaat
car1.applyBrake()