Sobes.tech
Junior — Middle

Εξηγήστε τη βασική διαφορά μεταξύ των κλεισίμάτων που επιτρέπουν να βγουν εκτός του πεδίου τους και αυτών που δεν μπορούν.

sobes.tech AI

Απάντηση από AI

Στο iOS (Swift/Objective-C), οι κλεισίματα (closures) μπορούν να καταγράψουν μεταβλητές από το εξωτερικό πεδίο. Η βασική διαφορά μεταξύ των κλεισιμάτων που μπορούν να βγουν από το πεδίο τους και αυτών που δεν μπορούν, σχετίζεται με τον χρόνο ζωής και τη σύλληψη του πλαισίου:

  • Τα κλεισίματα που μπορούν να βγουν από το πεδίο τους είναι αντικείμενα που καταγράφουν αναφορές σε μεταβλητές από το εξωτερικό πλαίσιο και τις διατηρούν, επιτρέποντας τη χρήση αυτών των μεταβλητών ακόμα και μετά το τέλος του αρχικού πεδίου. Τέτοια κλεισίματα αποθηκεύονται συνήθως σε ιδιότητες, περνιούνται ως callbacks κ.λπ.

  • Τα κλεισίματα που δεν μπορούν να βγουν από το πεδίο τους είναι αυτά που δεν αποθηκεύονται ή δεν καταγράφουν το πλαίσιο, ή χρησιμοποιούνται μόνο μέσα στο ίδιο πεδίο όπου ορίζονται. Δεν μπορούν να κληθούν αργότερα, καθώς το πλαίσιο έχει ήδη καταστραφεί.

Παράδειγμα:

func makeIncrementer(amount: Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = {
        total += amount
        return total
    }
    return incrementer
}

let inc = makeIncrementer(amount: 5)
print(inc()) // 5
print(inc()) // 10

Εδώ, το κλείσιμο incrementer καταγράφει τις μεταβλητές total και amount και τις διατηρεί, επιτρέποντάς τους να χρησιμοποιηθούν εκτός της αρχικής συνάρτησης. Αν το κλείσιμο δεν καταγράφει το πλαίσιο ή δεν αποθηκεύεται, δεν θα λειτουργεί μετά την έξοδο από τη συνάρτηση.