Ποια είναι η διαφορά μεταξύ αντιγραφής ενός πίνακα και αντιγραφής μιας δομής στη γλώσσα προγραμματισμού Swift;
sobes.tech AI
Απάντηση από AI
Η αντιγραμμένη δομή είναι ένα νέο ανεξάρτητο στιγμιότυπο. Οι αλλαγές σε μια δομή δεν επηρεάζουν την άλλη.
Ο αντίγραφος ενός πίνακα (Array) στο Swift γίνεται προεπιλεγμένα με "copy-on-write" (αντιγραφή κατά την εγγραφή). Αυτό σημαίνει ότι, κατά τη δημιουργία μιας νέας αναφοράς σε έναν πίνακα, τα δεδομένα δεν διπλασιάζονται μέχρι να τροποποιηθεί ένα από τα αντίγραφα. Μέχρι τότε, και οι δύο μεταβλητές αναφέρονται στα ίδια στοιχεία στη μνήμη. Όταν τροποποιείται ένα από τα αντίγραφα, δημιουργείται ένα νέο ανεξάρτητο στιγμιότυπο δεδομένων.
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1 // Αντίγραφο της δομής. Το p2 είναι ένα νέο στιγμιότυπο
p2.x = 10 // Η αλλαγή στο p2 δεν επηρεάζει το p1
print("p1: \(p1.x), \(p1.y)") // Έξοδος: p1: 1, 2
print("p2: \(p2.x), \(p2.y)") // Έξοδος: p2: 10, 2
var array1 = [1, 2, 3]
var array2 = array1 // Αντίγραφο κατά την εγγραφή
array2[0] = 10 // Πραγματική αντιγραφή δεδομένων
print("array1: \(array1)") // Έξοδος: array1: [1, 2, 3]
print("array2: \(array2)") // Έξοδος: array2: [10, 2, 3]
Η διαφορά έγκειται στη θεμελιώδη συμπεριφορά: οι δομές αντιγράφονται πάντα με τιμή, ενώ οι πίνακες, ως δομές, υλοποιούν την βελτιστοποίηση "copy-on-write" για πιο αποδοτική διαχείριση μνήμης σε πολλαπλές αναφορές.