Published on

Swiftda Closures

Authors

Swiftda, closure β€” bu nomsiz funksiyaga o'xshash maxsus kod bloki. Masalan,

Swift
Oddiy closure
let greet = { print("Hello World!") } greet()

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:

Swift
Parametrli Closure
let example = { (name: String) -> String in return "Hello, \(name)" } print(example("Swift"))

Closure parametrlari

Closure ham parametr qabul qilishi mumkin:

Swift
Parametrli Closure
// bitta parametr qabul qiladigan closure let greetUser = { (name: String) in print("Salom, \(name).") } // closure chaqirish greetUser("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:

Swift
Qiymat qaytaradigan Closure
// closure e'loni let findSquare = { (num: Int) -> Int in let square = num * num return square } // closure chaqirish let result = findSquare(3) print("Kvadrat:", result)

Tushuntirish:

  • (num: Int) β€” parametr
  • -> Int β€” qaytish turi
  • return square β€” qaytariladigan qiymat

Closureni funksiya parametri sifatida yuborish

Swiftda closureni funksiyaga parametr qilib berish mumkin:

Swift
Closure parametri
// funksiya e'loni func grabLunch(search: () -> ()) { print("Keling, tushlikka chiqamiz") // closure chaqirish search() } // parametr sifatida closure berish grabLunch(search: { print("Alfredo's Pizza: 2 mil uzoqlikda") })

Bu yerda:

  • search β€” funksiya parametri
  • () -> () β€” closure turi
  • search() β€” closure chaqirilyapti

Trailing Closure

Agar funksiya oxirgi parametr sifatida closure qabul qilsa:

Swift
Trailing Closure
func grabLunch(message: String, search: ()->()) { print(message) search() } // trailing closure ishlatish grabLunch(message: "Keling, tushlikka chiqamiz") { print("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:

Swift
Autoclosure
// avtomatik closure funksiyasi func display(greet: @autoclosure () -> ()) { greet() } // {} ishlatmasdan closure berish display(greet: print("Hello World!"))

@autoclosure β€” avtomatik ravishda {} qo'shib beradi.

Eslatma: autoclosure parametr qabul qila olmaydi.

Shorthand argument nomlari

Swiftda closure argumentlarini $0, $1, $2 kabi qisqa nomlash mumkin:

Swift
Shorthand arguments
let numbers = [1, 2, 3, 4, 5] // To'liq yozuv let doubled1 = numbers.map { (num: Int) -> Int in return num * 2 } // Qisqa yozuv let doubled2 = numbers.map { $0 * 2 } print("To'liq:", doubled1) print("Qisqa:", doubled2)

Birinchi masalaning yechimi

Keling, birinchi masala "Oddiy closure" ni birga yechib ko'ramiz:

1-qadam: Masalani tushunish

  • 5, 3 β†’ 5 + 3 = 8
  • 10, 20 β†’ 10 + 20 = 30

2-qadam: Yechim algoritmi

  1. Ikki Int parametr qabul qiladigan closure yaratamiz
  2. Ularni qo'shamiz
  3. Natijani qaytaramiz

3-qadam: Kodni yozamiz

Swift
Oddiy closure yechimi
let add: (Int, Int) -> Int = { (a, b) in return a + b } // Test print(add(5, 3)) // 8 print(add(10, 20)) // 30 print(add(-5, 5)) // 0

Qisqa yozuv:

Swift
Qisqa yozuv
let add: (Int, Int) -> Int = { $0 + $1 } print(add(5, 3)) // 8

Natija: Closure orqali oddiy qo'shish operatsiyasini yaratdik.

Buy mea coffee