Sobes.tech
Junior

Ποια είναι η διαφορά μεταξύ τύπων αναφοράς και τύπων τιμών;

sobes.tech AI

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

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

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

Χαρακτηριστικό Τύπος αναφοράς Τύπος τιμής
Αποθήκευση Αναφορά στα δεδομένα Τα ίδια τα δεδομένα
Ανάθεση Αντιγραφή της αναφοράς Αντιγραφή των δεδομένων
Αλλαγή Επηρεάζει όλες τις αναφορές Δεν επηρεάζει τα αντίγραφα
Τοποθέτηση Στο heap Στη στοίβα
Απελευθέρωση ARC / συλλέκτης απορριμμάτων Αυτόματα κατά την έξοδο από το πεδίο ορατότητας
Παραδείγματα σε Swift class, closure struct, enum, tuple, βασικοί τύποι (Int, Bool, String κ.λπ.)
// Παράδειγμα τύπου αναφοράς (κλάση)
class ReferenceType {
    var value: Int
    init(value: Int) {
        self.value = value
    }
}

let ref1 = ReferenceType(value: 10)
let ref2 = ref1 // Η αναφορά αντιγράφεται
ref2.value = 20 // Τα δεδομένα που δείχνουν τα ref1 και ref2 αλλάζουν
print(ref1.value) // Έξοδος: 20
print(ref2.value) // Έξοδος: 20

// Παράδειγμα τύπου τιμής (δομή)
struct ValueType {
    var value: Int
}

var val1 = ValueType(value: 10)
var val2 = val1 // Τα δεδομένα αντιγράφονται
val2.value = 20 // Μόνο τα δεδομένα στο val2 αλλάζουν
print(val1.value) // Έξοδος: 10
print(val2.value) // Έξοδος: 20