Published on

Swiftda metodlar

Authors

Swiftda class ichida e'lon qilingan funksiya metod deyiladi. Masalan,

class Person {
  . . .    
 
  // metodlarni e'lon qilish
  func greet() {
  // metod tanasi    
  }
}

Bu yerda greet() β€” Person classi ichida e'lon qilingan metod. Metodlar haqida o'rganishdan oldin swiftdagi class va struct qanday ishlashini bilib olish kerak.

Misol:

class Person {
  
  // metod e'lon qilish
  func greet() {
    print("Salom!")
  }
}

var nick = Person()

// metodga murojaat
nick.greet()

Natija:

Salom!

Yuqoridagi misolda Person classi ichida greet() nomli metod yaratdik. Bu yerda nick obyekti orqali metodga murojaat qildik.

// metodga murojaat
nick.greet()

greet() metodi shunchaki "Salom!" matnini chop etadi.

Misol:

// class yaratish
class Hall {

  var length = 0.0     // uzunlik
  var breadth = 0.0    // kenglik
  var height = 0.0     // balandlik

  // yuzani hisoblash metodi
  func calculateArea() {
    print("Xonaning yuzasi =", length * breadth)
  }

  // hajmni hisoblash metodi
  func calculateVolume() {
    print("Xonaning hajmi =", length * breadth * height)
  }
}

// Hall classidan obyekt yaratish
var hall1 = Hall()

hall1.length = 42.5
hall1.breadth = 30.8
hall1.height = 45.2

// calculateArea() metodiga murojaat
hall1.calculateArea()

// calculateVolume() metodiga murojaat
hall1.calculateVolume()

Natija:

Xonaning yuzasi = 1309.0
Xonaning hajmi = 59166.8

Yuqoridagi misolda Hall nomli class yaratdik, uning ikkita metodi bor:

  • calculateArea() β€” xonaning yuzasini hisoblaydi
  • calculateVolume() β€” xonaning hajmini hisoblaydi

Bu metodlar class ichida e'lon qilingani uchun ularga hall1 obyekti orqali murojaat qildik.

hall1.calculateArea()

hall1.calculateVolume()

Static metodlar

Oldingi misollarda metodlarga obyekt orqali murojaat qilgan edik. Ammo obyekt yaratmasdan ham murojaat qilinadigan metodlar mavjud.

Bunday metodlar static metodlar deyiladi. Swiftda static metod yaratish uchun static kalit so'zidan foydalanamiz. Masalan,

class Calculator {

  // static metod 
  static func add() {
  ...  
  }
}

Bu yerda add() β€” static metod.

Static metodga murojaat qilish uchun klass nomidan foydalanamiz. Masalan,

// static metodga murojaat
Calculator.add()

Misol:

class Calculator {

  // non-static metod
  func multiply(num1: Int, num2: Int) -> Int {
    return num1 * num2
  }

  // static metod
  static func add(num1: Int, num2: Int) -> Int {
    return num1 + num2
   }
}

// Calculator classidan obyekt yaratish
var obj = Calculator()

// static metodga murojaat
var result2 = Calculator.add(num1: 2, num2: 3)
print("2 + 3 =", result2)

// non-static metodga murojaat
var result1 = obj.multiply(num1: 2, num2: 2)
print("2 * 2 =", result1)

Natija:

2 + 3 = 5
2 * 2 = 4

Yuqoridagi misolda Calculator nomli class yaratdik. Class ichida static metod: add() va non-static metod: multiply() mavjud.

Bu yerda:

  • Calculator.add() β€” static metod, klass nomi orqali chaqiriladi
  • obj.multiply() β€” non-static metod, obyekt orqali chaqiriladi

Static metod β€” klass turiga tegishli (obyekt emas), shuning uchun ularga klass nomi orqali murojaat qilamiz.

Xuddi shunday, struct ichida ham static metodlar yaratish mumkin. Ularga struct nomi orqali murojaat qilinadi.

Metodlarda self propertysi

Ba'zan property nomi va metod parametri bir xil bo'lishi mumkin. Masalan,

var physics = 0

func checkEligibility(physics: Int) {
... 
}

Bu yerda property va metod parametri bir xil nomga ega: physics.

Bunday holatlarda noaniqlik yuzaga kelishi mumkin. Ularni farqlash uchun self propertysi ishlatiladi. self β€” metoddagi joriy obyektga murojaat qiladi.

Misol:

class Marks {

  var physics = 0     // fizika bali

  func checkEligibility(physics: Int) {

    // self propertysi ishlatilmoqda
    if (self.physics < physics) {
      print("Qabul uchun nomzod emas")
    }

    else {
      print("Qabul uchun nomzod")
    }
  }
}

var student1 = Marks()
student1.physics = 28
student1.checkEligibility(physics: 50)

Natija:

Qabul uchun nomzod emas

Yuqoridagi misolda property va metod parametri uchun bir xil physics nomini ishlatdik.

Ularni farqlash uchun checkEligibility() metodi ichida self propertysi ishlatildi:

if (self.physics < physics) {
  ...
}

Bu yerda:

  • self.physics β€” student1 obyektining propertysi, qiymati 28
  • physics β€” metod parametri, qiymati 50

Shart (28 < 50) bajarilgani uchun if ichidagi kod ishlaydi.

Mutating metodlar

Swiftda class yoki struct ichidagi propertylarni metodlar ichidan o'zgartira olmaymiz. Masalan,

struct Employee {

  var salary = 0.0     // maosh
  ...
  func salaryIncrement() {
    // Xato kod
    salary = salary * 1.5
  }
}

Bu yerda struct β€” value type bo'lgani uchun salary qiymatini o'zgartirishga urinish xatoga olib keladi.

Ammo value type propertylarini metod ichidan o'zgartirish kerak bo'lsa, metod e'lon qilishda mutating kalit so'zini ishlatishimiz kerak.

Misol:

struct Employee {
  var salary = 0     // maosh
  
  // mutating metodini e'lon qilish
  mutating func salaryIncrement(increase: Int) {

  // salary propertyni o'zgartirish  
  salary = salary + increase
  print("Oshirilgan maosh:", salary)
  }
}

var employee1 = Employee()
employee1.salary = 20000
employee1.salaryIncrement(increase: 5000)

Natija:

Oshirilgan maosh: 25000

Yuqoridagi misolda Employee nomli struct yaratdik. E'tibor bering:

mutating func salaryIncrement(increase: Int) {

  // salary propertyni o'zgartirish  
  salary = salary + increase
  ...
}