- Published on
Swiftda Closures
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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)— parametrin— parametrlar va closure tanasini ajratadigreetUser("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 turireturn 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 '()'