Junior
Quelle est la différence entre structures et classes en Swift?
sobes.tech IA
Réponse de l'IA
Principales différences:
- Type de valeur vs. Type de référence: Les structures sont des types de valeur, les classes sont des types de référence. Lors de l'assignation d'une structure ou de son passage à une fonction, la valeur est copiée. Lors de l'assignation d'une classe ou de son passage à une fonction, la référence à un bloc mémoire est copiée.
- Héritage: Les structures ne supportent pas l'héritage. Les classes supportent l'héritage, permettant de créer des hiérarchies d'objets.
- Desinitialiseurs: Les structures n'ont pas de desinitialiseurs. Les classes peuvent avoir un
deinitpour libérer des ressources. - Égalité d'identité: Pour les structures, la valeur de toutes leurs propriétés est comparée (par défaut avec
==). Pour les classes,==compare par défaut les références (identité). - Performance: Les structures sont généralement plus performantes pour de petites quantités de données, car elles n'utilisent pas d'allocation dynamique sur le tas et n'ont pas de coûts supplémentaires liés au comptage de références (ARC).
| Critère | Structure (Struct) | Classe (Class) |
|---|---|---|
| Type | Valeurs (Type de valeur) | Références (Type de référence) |
| Héritage | Non | Oui |
| Desinitialiseurs | Non | Oui (deinit) |
| Égalité d'identité | Comparaison par valeur | Comparaison par référence |
| Emplacement | Généralement sur la pile (pour variables locales) | Sur le tas |
| ARC | Non | Oui |
Le choix entre structure et classe dépend des besoins. Les structures conviennent pour modéliser des données où le passage par valeur est important (par exemple, coordonnées, taille). Les classes sont utilisées lorsque l'héritage, une référence mutable partagée à un objet ou la gestion du cycle de vie des ressources sont nécessaires.
// Exemple de structure
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 est une copie de p1
p2.x = 5.0
// p1.x reste 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Exemple de classe
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("L'instance de Circle est en train d'être désinitialisée.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 référence la même instance que c1
c2.radius = 10.0
// c1.radius devient aussi 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Comparaison d'identité
if c1 === c2 { // Compare les références
print("c1 et c2 font référence à la même instance de Circle.")
} else {
print("c1 et c2 ne font pas référence à la même instance de Circle.")
}
// Comparaison de valeurs (pour les structures)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Compare toutes les propriétés
print("p1 et p3 ont la même valeur.")
} else {
print("p1 et p3 n'ont pas la même valeur.")
}