Published on

Swiftda Closures

Authors

Swiftda, closure — bu nomsiz funksiyaga o‘xshash maxsus kod bloki. Masalan,

{
  print("Hello World")
}

Bu yerda Hello World chiqaradigan closure yaratilgan.

Closure haqida o‘rganishdan oldin Swift funksiyalarini bilish muhim.

Closure e’lon qilish

Closure yaratishda func kalit so‘zi ishlatilmaydi. Sintaksis quyidagicha:

{ (parameters) -> returnType in
   // operatorlar
}

Bu yerda:

  • parameters — closure qabul qiladigan qiymatlar
  • returnType — closure qaytaradigan qiymat turi
  • in — parametrlar/qaytish turini closure tanasidan ajratadi

Misol:

var greet = {
  print("Hello, World!")
}

Bu yerda closure greet o‘zgaruvchisiga tayinlandi.

Chaqirish:

// closure chaqirish
greet()

U faqat Hello World ni chiqaradi.

bu closure parametrsiz va qaytish turiga ega emas.

Misol:

// closure e’lon qilish
var greet = {
  print("Hello, World!")
}

// closure chaqirish
greet()

Natija:

Hello, World!

Closure chaqirilganda uning ichidagi print() bajariladi.

Closure parametrlari

Closure ham parametr qabul qilishi mumkin:

// bitta parametr qabul qiladigan closure
let greetUser = { (name: String) in
    print("Salom, \(name).")
}

// closure chaqirish
greetUser("Delilah")

Natija:

Salom, Delilah.

E’tibor bering:

  • (name: String) — parametr
  • in — parametrlar va closure tanasini ajratadi
  • greetUser("Delilah") — parametr nomi yozilmaydi

Qiymat qaytaradigan Closure

Closure qiymat qaytarishi ham mumkin:

// closure e’loni
var findSquare = { (num: Int) -> (Int) in
  var square = num * num
  return square
}

// closure chaqirish
var result = findSquare(3)

print("Kvadrat:", result)

Natija:

Kvadrat: 9

Tushuntirish:

  • (num: Int) — parametr
  • -> (Int) — qaytish turi
  • return square — qaytariladigan qiymat

Closureni funksiya parametri sifatida yuborish

Swiftda closureni funksiyaga parametr qilib berish mumkin:

// funksiya e’loni
func grabLunch(search: () -> ()) {
  // closure chaqirish
  search()
}

Bu yerda:

  • search — funksiya parametri
  • () -> () — closure turi
  • search() — closure chaqirilyapti

Funksiyani chaqirish:

grabLunch(search: {
  print("Alfredo’s Pizza: 2 mil uzoqlikda")
})

Misol:

// funksiya va closure berish
func grabLunch(search: ()->()) {
  print("Keling, tushlikka chiqamiz")

  // closure chaqirish
  search()
}

// parametr sifatida closure berish
grabLunch(search: {
   print("Alfredo’s Pizza: 2 mil uzoqlikda")
})

Natija:

Keling, tushlikka chiqamiz
Alfredo’s Pizza: 2 mil uzoqlikda

Trailing Closure

Agar funksiya oxirgi parametr sifatida closure qabul qilsa:

func grabLunch(message: String, search: ()->()) {
  ...
}

Funksiyani quyidagicha chaqirish mumkin:

grabLunch(message:"Keling, tushlikka chiqamiz") {
  // closure tanasi
}

Misol:

func grabLunch(message: String, search: ()->()) {
   print(message)
   search()
}

// trailing closure ishlatish
grabLunch(message:"Keling, tushlikka chiqamiz")  {
  print("Alfredo’s Pizza: 2 mil uzoqlikda")
}

Natija:

Keling, tushlikka chiqamiz
Alfredo’s Pizza: 2 mil uzoqlikda

Bu yerda closure oxirgi parametr bo‘lgani uchun trailing closure shaklida yozildi.

Autoclosure

Funksiya chaqirilayotganda closure’ni {} ishlatmasdan berish mumkin:

// {} bilan
display(greet:{
  print("Hello World!")
})

// {} siz
display(greet: print("Hello World!"))

Buning uchun funksiya quyidagicha yoziladi:

func display(greet: @autoclosure () -> ()) {
 ...
}

@autoclosure — avtomatik ravishda {} qo‘shib beradi.

Misol:

// avtomatik closure funksiyasi
func display(greet: @autoclosure () -> ()) {
 greet()
}

// {} ishlatmasdan closure berish
display(greet: print("Hello World!"))

Natija:

Hello World!

Eslatma: autoclosure parametr qabul qila olmaydi. Aks holda xatolik yuz beradi: argument type of @autoclosure parameter must be '()'