Sobes.tech
Junior

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

sobes.tech AI

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

Τύποι Αξίας (Value Types) αντιγράφονται κατά την ανάθεση ή τη μεταβίβαση σε μια συνάρτηση. Κάθε περίπτωση έχει το δικό της αντίγραφο δεδομένων.

Τύποι Αναφοράς (Reference Types), κατά την ανάθεση ή τη μεταβίβαση σε μια συνάρτηση, περνούν μια αναφορά στην ίδια περίπτωση δεδομένων. Οι αλλαγές στα δεδομένα μέσω μιας αναφοράς θα αντικατοπτρίζονται σε όλες τις άλλες αναφορές σε αυτήν την ίδια περίπτωση.

Χαρακτηριστικό Τύπος Αξίας (Value Type) Τύπος Αναφοράς (Reference Type)
Συμπεριφορά κατά την ανάθεση/μεταβίβαση Αντιγραφή Μεταβίβαση αναφοράς
Τοποθεσία στη μνήμη Στοίβα (Heap) Στοίβα (Stack)
Διαχείριση μνήμης Αυτόματη (μέσω στοίβας) Αυτόματη (ARC)
Παραδείγματα σε Swift struct, enum, tuple class, func, closure
// Παράδειγμα Τύπου Αξίας (Struct)
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 1, y: 2)
var p2 = p1 // p2 λαμβάνει ένα αντίγραφο του p1
p2.x = 10   // Η αλλαγή στο p2 δεν επηρεάζει το p1
print("p1: \(p1)") // p1: Point(x: 1, y: 2)
print("p2: \(p2)") // p2: Point(x: 10, y: 2)

// Παράδειγμα Τύπου Αναφοράς (Κλάση)
class Coordinate {
    var x: Int
    var y: Int
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

var c1 = Coordinate(x: 1, y: 2)
var c2 = c1 // c2 αναφέρεται στο ίδιο αντικείμενο με το c1
c2.x = 10   // Η αλλαγή στο c2 επηρεάζει το c1, καθώς και οι δύο αναφέρονται στο ίδιο αντικείμενο
print("c1: \(c1.x)") // c1: 10
print("c2: \(c2.x)") // c2: 10