Published on

Swiftda ichma-ich funksiyalar (Nested Functions)

Authors

Swiftda bir funksiya ichida boshqa funksiya bo‘lishi mumkin. Bunday funksiyalar ichma-ich funksiyalar (nested functions) deb ataladi.

Ichma-ich funksiyalarni o‘rganishdan oldin Swift funksiyalari bilan tanish bo‘lish tavsiya etiladi.

Ichma-ich funksiyaning sintaksisi

Swiftda ichma-ich funksiya quyidagicha yaratiladi:

// tashqi funksiya
func function1() {
  // kod

  // ichki funksiya
  func function2() {
    // kod
  }

}

Bu yerda function2() funksiyasi tashqi funksiya function1() ichida joylashgan.

Misol:

// tashqi funksiya
func greetMessage() {

  // ichki funksiya
  func displayName() {
    print("Good Morning Abraham!")
  }

  // ichki funksiyani chaqirish
  displayName()
}

// tashqi funksiyani chaqirish
greetMessage()

Natija

Good Morning Abraham!

Yuqoridagi misolda biz ikki funksiya yaratdik:

  • greetMessage() — oddiy tashqi funksiya
  • displayName() — ichki funksiya (tashqi funksiya ichida joylashgan)

Bu yerda ichki funksiya displayName() tashqi funksiya ichida chaqirilmoqda.

Agar biz ichki funksiyani tashqi funksiyadan tashqarida chaqirmoqchi bo‘lsak, xato keladi:use of unresolved identifier

Misol:

// tashqi funksiya
func addNumbers() {
  print("Addition")

  // ichki funksiya
  func display(num1: Int, num2: Int) {
      print("5 + 10 =", num1 + num2)
  }

  // ichki funksiyani ikki qiymat bilan chaqirish
  display(num1: 5, num2: 10)
}

// tashqi funksiyani chaqirish
addNumbers()

Natija

Addition
5 + 10 = 15

Bu misolda display() funksiyasi addNumbers() funksiyasi ichida joylashgan.

Ichki funksiyada ikki parametr bor:

func display(num1: Int, num2: Int)

Shu sabab, funksiyani chaqirganda 5 va 10 uzatilgan:

display(num1: 5, num2: 10)

Misol:

func operate(symbol: String) -> (Int, Int) -> Int {

  // ikki sonni qo‘shadigan ichki funksiya
  func add(num1:Int, num2:Int) -> Int {
    return num1 + num2
  }

  // ikki sonni ayiradigan ichki funksiya    
  func subtract(num1:Int, num2:Int) -> Int {
    return num1 - num2
  }

  let operation = (symbol == "+") ?  add : subtract
  return operation
}

let operation = operate(symbol: "+")
let result = operation(8, 3)
print("Result:", result)

Natija

Result: 11

Yuqoridagi misolda add() va subtract() funksiyalari operate() funksiyasi ichida joylashgan.

E’tibor bering:

func operate(symbol: String) -> (Int, Int) -> Int

Bu yerda (Int, Int) -> Int — tashqi funksiyaning qaytariladigan qiymat turi.

Ya’ni, tashqi funksiya ikkita Int parametr qabul qiladigan va Int qaytaradigan funksiyani qaytaradi.

Bu tur ichki funksiyalar (add yoki subtract) bilan bir xil bo‘lgani uchun, tashqi funksiya ichki funksiyalardan birini qaytaradi.

Shu sababdan, tashqi funksiyani chaqirgandan so‘ng ichki funksiyani tashqaridan ham chaqirish mumkin:

let result = operation(8, 3)

Bu yerda operation(8, 3)add(8, 3) yoki subtract(8, 3) funksiyasining natijasiga almashtiriladi. Qaysi biri ishlatilishi symbol qiymatiga bog‘liq.