Junior
Ποια είναι η διαφορά μεταξύ δομών και κλάσεων στο Swift;
sobes.tech AI
Απάντηση από AI
Βασικές διαφορές:
- Τύπος τιμής vs. Τύπος αναφοράς: Οι δομές είναι τύποι τιμής, οι κλάσεις είναι τύποι αναφοράς. Όταν αναθέτετε μια δομή ή την περνάτε σε μια συνάρτηση, αντιγράφεται η τιμή. Όταν αναθέτετε μια κλάση ή την περνάτε σε μια συνάρτηση, αντιγράφεται η αναφορά σε ένα μπλοκ μνήμης.
- Κληρονομικότητα: Οι δομές δεν υποστηρίζουν κληρονομικότητα. Οι κλάσεις υποστηρίζουν κληρονομικότητα, επιτρέποντας τη δημιουργία ιεραρχιών αντικειμένων.
- Αποσυμπίεση (Deinitializers): Οι δομές δεν έχουν αποσυμπιεστές. Οι κλάσεις μπορούν να έχουν
deinitγια απελευθέρωση πόρων. - Ταυτότητα ισότητας: Για τις δομές, συγκρίνεται η τιμή όλων των ιδιοτήτων τους (κατά προεπιλογή με
==). Για τις κλάσεις, το==συγκρίνει κατά προεπιλογή τις αναφορές (ταυτότητα). - Απόδοση: Οι δομές είναι γενικά πιο αποδοτικές όταν εργάζεστε με μικρούς όγκους δεδομένων, καθώς δεν χρησιμοποιούν δυναμική κατανομή μνήμης στο σωρό και δεν έχουν πρόσθετα έξοδα για την καταμέτρηση αναφορών (ARC).
| Κριτήριο | Δομή (Struct) | Κλάση (Class) |
|---|---|---|
| Τύπος | Τιμές (Value Type) | Αναφορές (Reference Type) |
| Κληρονομικότητα | Όχι | Ναι |
| Αποσυμπιεστές | Όχι | Ναι (deinit) |
| Ταυτότητα ισότητας | Σύγκριση τιμής | Σύγκριση αναφορών |
| Τοποθεσία | Συνήθως στο στοίβα (για τοπικές μεταβλητές) | Στο σωρό |
| ARC | Όχι | Ναι |
Η επιλογή μεταξύ δομής και κλάσης εξαρτάται από τις ανάγκες. Οι δομές είναι καλές για την μοντελοποίηση δεδομένων όπου η μεταφορά με τιμή είναι σημαντική (π.χ. συντεταγμένες, μέγεθος). Οι κλάσεις χρησιμοποιούνται όταν απαιτείται κληρονομικότητα, κοινή μεταβλητή αναφοράς σε ένα αντικείμενο ή διαχείριση κύκλου ζωής πόρων.
// Παράδειγμα δομής
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 είναι ένα αντίγραφο του p1
p2.x = 5.0
// Το p1.x παραμένει 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Παράδειγμα κλάσης
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("Η κλάση Circle αποδεσμεύεται.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 αναφέρεται στην ίδια παρουσία με το c1
c2.radius = 10.0
// c1.radius γίνεται επίσης 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Σύγκριση ταυτότητας
if c1 === c2 { // Συγκρίνει τις αναφορές
print("c1 και c2 αναφέρονται στην ίδια παρουσία της κλάσης Circle.")
} else {
print("c1 και c2 δεν αναφέρονται στην ίδια παρουσία της κλάσης Circle.")
}
// Σύγκριση τιμών (για δομές)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Συγκρίνει όλες τις ιδιότητες
print("p1 και p3 έχουν την ίδια τιμή.")
} else {
print("p1 και p3 δεν έχουν την ίδια τιμή.")
}