Sobes.tech
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 deinit pour 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.")
}