Sobes.tech
Junior

Τι είναι το lazy;

sobes.tech AI

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

Η λέξη-κλειδί lazy χρησιμοποιείται για την καθυστερημένη αρχικοποίηση μιας ιδιότητας.

Μια ιδιότητα με lazy αρχικοποιείται μόνο κατά την πρώτη πρόσβαση σε αυτήν. Αυτό είναι χρήσιμο για:

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

Οι ιδιότητες lazy πρέπει να είναι:

  • Μεταβλητές (var), καθώς η τιμή τους μπορεί να αλλάξει κατά την πρώτη πρόσβαση.
  • Χωρίς παρατηρητές ιδιοτήτων (willSet, didSet) μέχρι την πρώτη πρόσβαση.
class HeavyResource {
    init() {
        print("Βαρύς πόρος αρχικοποιήθηκε")
        // Προσομοίωση δαπανηρής αρχικοποίησης
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // ιδιότητα lazy, αρχικοποιείται κατά την πρώτη χρήση
    lazy var heavyResource: HeavyResource = {
        print("Δημιουργία βαρύ πόρου")
        return HeavyResource()
    }()

    init() {
        print("\(name) αρχικοποιήθηκε")
    }

    func accessResource() {
        print("Πρόσβαση σε βαρύ πόρο...")
        _ = heavyResource // Εδώ γίνεται η αρχικοποίηση της ιδιότητας lazy
        print("Πόρος προσπελάστηκε")
    }
}

// Αρχικοποίηση του παρουσιαστή
let presenter = MyPresenter() // Έξοδος: Presenter αρχικοποιήθηκε

// Η πρόσβαση στον πόρο γίνεται αργότερα, όταν πραγματικά χρειάζεται
presenter.accessResource()
/*
Έξοδος:
Πρόσβαση σε βαρύ πόρο...
Δημιουργία βαρύ πόρου
Βαρύς πόρος αρχικοποιήθηκε
Πόρος προσπελάστηκε
*/

// Η επαναληπτική πρόσβαση δεν προκαλεί επανεκκίνηση
presenter.accessResource()
/*
Έξοδος:
Πρόσβαση σε βαρύ πόρο...
Πόρος προσπελάστηκε
*/