Sobes.tech
Junior

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, sorted metodları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...
    }
}