Bağlama nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Swift-də bağlama (closure) — bu, kodda ötürülə bilən və istifadə oluna bilən müstəqil funksiya blokudur ({}). Bağlamalar, onları təyin etdikləri kontekstdən hər hansı sabit və ya dəyişənə istinadları ələ keçirə və saxlaya bilər.
İstifadə nümunələri:
- Funksiya arqumentləri kimi (məsələn, tamamlanma idarəediciləri).
- Kolleksiyaların siyahıya alınması zamanı davranışın müəyyənləşdirilməsi (məsələn,
map,filter,reduce,sortedmetodlarından istifadə etməklə). - Kodun gecikdirilmiş icrası üçün.
Sintaksis:
// Əsas sintaksis
{ (parametrlər) -> dönüşTipi in
bəyanatlar
}
// Int qəbul edən və String qaytaran bağlama nümunəsi
let integerToString: (Int) -> String = { (number: Int) -> String in
return "Rəqəm: \(number)"
}
Xüsusiyyətlər:
- Dəyişənlərin avtomatik ələ keçirilməsi.
- Parametrlərin və dönüş dəyərinin açıq şəkildə göstərilmədiyi bağlamaların təyin edilməsi (sintaktik şəkər).
- Parametrlər üçün qısaldılmış adların istifadəsi ($0, $1 və s.).
- Bağlamanın trailing closure sintaksisi.
Dəyişənlərin ələ keçirilməsi:
Bağlama, öz ətraf mühitindən dəyişənləri ələ keçirə bilər. Standart olaraq, ələ keçirmə referens vasitəsilə həyata keçirilir. Əgər bağlama, mənbə dəyişəni sahədən çıxdıqdan sonra istifadə olunursa, ona hələ də giriş əldə edir.
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0 // Xarici kontekstdən dəyişən
let incrementer: () -> Int = { // Bağlama
runningTotal += amount // runningTotal və amount-u ələ keçirir
return runningTotal
}
return incrementer
}
let incrementByTen = makeIncrementer(forIncrement: 10)
print(incrementByTen()) // Çıxış: 10
print(incrementByTen()) // Çıxış: 20
Əldə etmə siyahıları (Capture Lists):
Dəyişənlərin necə ələ keçiriləcəyini açıq şəkildə göstərmək və güclü istinad döngələrini (retain cycles) qarşısını almaq üçün istifadə olunur.
class MyClass {
var value = 0
lazy var myClosure: () -> Void = { [self, value] in // self-ni referansla, value-u dəyər kimi ələ keçir
print("self.value-in dəyəri: \(self.value)")
print("Əldə edilmiş dəyər: \(value)")
}
deinit {
print("MyClass nümunəsi sərbəst buraxıldı")
}
}
Sınıf obyektlərinin ələ keçirilməsində güclü istinad döngələrini qarşısını almaq üçün [weak self] və ya [unowned self] sintaksisindən istifadə olunur.
class ViewController {
var dataFetcher: DataFetcher?
func fetchData() {
dataFetcher?.fetch { [weak self] result in // Zəif ələ keçirmə
guard let self = self else { return } // self-in mövcudluğunu yoxlamaq
// Nəticənin işlənməsi
}
}
}
class DataFetcher {
var completionHandler: ((Result<String, Error>) -> Void)?
func fetch(completion: @escaping (Result<String, Error>) -> Void) {
self.completionHandler = completion
// Asinxron əməliyyat...
}
}