Sobes.tech
Junior — Middle

Χρειάζεται να χρησιμοποιηθεί μηχανισμός διαφυγής για τις κλεισίματα που περνιούνται ως ορίσματα σε μια συνάρτηση;

sobes.tech AI

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

Στο Swift, τα κλεισίματα (closures) είναι από προεπιλογή non-escaping, δηλαδή δεν μπορούν να αποθηκευτούν και να κληθούν μετά το τέλος της λειτουργίας στην οποία περνάνε.

Αν χρειάζεται να αποθηκεύσετε και να καλέσετε το κλείσιμο αργότερα (π.χ., σε μια ασύγχρονη κλήση, callback), πρέπει να το σημειώσετε ως @escaping.

Παράδειγμα:

func performAsyncTask(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // κάποια εργασία
        completion() // καλούμε το κλείσιμο αργότερα
    }
}

Αν το κλείσιμο χρησιμοποιείται μόνο μέσα στη λειτουργία και δεν αποθηκεύεται, το @escaping δεν χρειάζεται.

Έτσι, ο μηχανισμός escaping πρέπει να χρησιμοποιείται μόνο όταν το κλείσιμο μπορεί να κληθεί μετά την έξοδο από τη λειτουργία στην οποία έχει περαστεί.