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