Tiré du livre Apple "L'une des différences les plus importantes entre les structures et les classes est que les structures sont toujours copiées lorsqu'elles sont transmises dans votre code, mais les classes sont passées par référence."
Quelqu'un peut-il m'aider à comprendre ce que cela signifie? Pour moi, les classes et les structures semblent être les mêmes.
void my_func(int a)
vsvoid my_func(int &a)
. C'est une question de programmation très fondamentale. En savoir plus: stackoverflow.com/questions/373419/…Réponses:
Voici un exemple avec un
class
. Notez que lorsque le nom est modifié, l'instance référencée par les deux variables est mise à jour.Bob
est maintenantSue
, partout quiBob
a jamais été référencé.Et maintenant, avec a,
struct
nous voyons que les valeurs sont copiées et que chaque variable conserve son propre ensemble de valeurs. Lorsque nous définissons le nom surSue
, laBob
structure inaStruct
n'est pas modifiée.Donc, pour représenter une entité complexe avec état, a
class
est génial. Mais pour les valeurs qui sont simplement une mesure ou des bits de données associées, astruct
est plus logique afin que vous puissiez facilement les copier et les calculer avec elles ou modifier les valeurs sans craindre d'effets secondaires.la source
aStruct and bStruct are two structs with the same value!
cela me trouble car les valeurs des variables à l'intérieur de la structure sont différentes.aStruct
etbStruct
ont des valeurs identiques. Ils ont tous deux un seulname
champ qui est défini sur"Bob"
. Mais ce sont deux structures différentes. Cela est prouvé sur la ligne suivante lorsque vous pouvez changer le nom de l'une des structures et que l'autre reste inchangée.La classe et la structure peuvent faire:
Seule la classe peut faire:
la source
struct
sont des types de valeur. Cela signifie que si vous copiez l'instance de la structure dans une autre variable, elle est simplement copiée dans la variable.Exemple de type de valeur
Les classes sont des types de référence. Cela signifie que si vous affectez une instance de la classe à une variable, elle ne contiendra que la référence à l'instance et non la copie .
la source
Les réponses ci-dessus sont correctes J'espère que ma réponse aidera quelqu'un qui ne comprend pas les réponses ci-dessus.
Eh bien dans Swift Il existe deux types d'objets
La principale différence entre eux est
Par exemple ici code pour bien comprendre.
C'était la principale différence, mais nous avons également des sous-différences.
Classe
Struct
la source
Cette question semble être en double mais peu importe, ce qui suit répondrait à la plupart des cas d'utilisation:
L'une des différences les plus importantes entre les structures et les classes est que les structures sont des types valeur et sont toujours copiées lorsqu'elles sont transmises dans votre code, et que les classes sont de type référence et sont passées par référence.
En outre, les classes ont l'héritage qui permet à une classe d'hériter des caractéristiques d'une autre.
Les propriétés Struct sont stockées sur la pile et les instances de classe sont stockées sur le tas, par conséquent, la pile est parfois considérablement plus rapide qu'une classe.
Struct obtient automatiquement un initialiseur par défaut alors qu'en Class, nous devons initialiser.
Struct est thread-safe ou singleton à tout moment.
Et aussi, pour résumer la différence entre les structures et les classes, il est nécessaire de comprendre la différence entre les types valeur et référence.
// sampleplayground.playground
Production:
la source
Si vous regardez plus loin dans le manuel Apple, vous verrez cette section: "Les structures et les énumérations sont des types de valeur"
Dans cette section, vous verrez ceci:
C'est la plus grande différence entre les structures et les classes. Les structures sont copiées et les classes sont référencées.
la source
Habituellement (dans la plupart des langages de programmation), les objets sont des blocs de données qui sont stockés sur le tas, puis une référence (normalement un pointeur) à ces blocs, contient un
name
est utilisé pour accéder à ces blocs de données. Ce mécanisme permet de partager des objets dans le tas en copiant la valeur de leurs références (pointeurs). Ce n'est pas le cas des types de données de base tels que les entiers, et c'est parce que la mémoire nécessaire pour créer une référence est presque la même que l'objet (dans ce cas, une valeur entière). Ainsi, ils seront passés en tant que valeurs et non en tant que référence dans le cas d'objets volumineux.Swift utilise struct afin d'améliorer les performances même avec des objets String et Array.
Une très bonne lecture ici
la source
Afin de comprendre la différence entre les structures et les classes, nous devons connaître la principale différence entre les types valeur et référence. Les structures sont des types de valeur et cela signifie que chaque changement sur eux modifiera simplement cette valeur, les classes sont des types de référence et chaque changement dans un type de référence modifiera la valeur allouée à cet endroit de mémoire ou de référence. Par exemple:
Commençons par une classe, cette classe est conforme à Equatable juste pour pouvoir comparer des instances, nous créons une instance appelée
pointClassInstanceA
et une autre appeléepointClassInstanceB
nous assignons la classe A à la classe B, maintenant l'assertion dit qu'elles sont les mêmes ...Ok, que s'est-il passé ici pourquoi si nous avons simplement changé la valeur x de pointsClassInstanceB, cela a également changé la valeur x de pointClassInstanceA? Eh bien, cela montre comment les types de référence fonctionnent, lorsque nous affectons l'instance A, en tant que valeur de l'instance B, puis nous modifions X de l'un d'entre eux, cela changera les deux X car ils partagent la même référence et ce qui a changé était la valeur de cela référence.
Faisons la même chose mais avec une structure
Nous avons fondamentalement la même structure que notre classe, mais maintenant vous pouvez voir que lorsque vous imprimez la valeur x de pointStructInstanceA, ce cas n'a pas changé, et c'est parce que les types de valeur fonctionnent différemment et que chaque changement sur l'une de leurs instances sera " indépendant "et n'affectera pas l'autre.
Swift suggère d'utiliser plus de types de valeur et vous pouvez dire que leurs bibliothèques sont basées sur des structures pour éviter les problèmes que les types de référence apportent, comme modifier involontairement une valeur, etc. Les structures sont la voie à suivre sur Swift. J'espère que ça aide.
la source
Voici un exemple qui montre précisément la différence entre struct et class.
capture d'écran du code écrit dans l'aire de jeux
la source
la source
Types Swift
Type :
Struct
,Enum
,Tuple
struct String
,struct Array
(Set
,Dictionary
)value type
une nouvelle copie des données est créée. En fait, le mécanismecopy on write
-COW
est utilisé avec certaines optimisations, par exemple la copie est créée lorsque l'objet est modifiéType de référence :
Class
,Function
reference type
une nouvelle référence à l'instance d'origine sera créée (l'adresse de l'instance est copiée).Value type
est recommandé d'utiliser par défaut . Le plus grand avantageValue type
est qu'ils sont généralementthread safe
Reference type
Avantages:deinit()
peut être utilisé,===
,Objective-C
interopérabilité car aValue Type
été introduit dans Swift.[let vs var, class vs struct]
Choix entre les structures et les classes
Types
Classes et structures
la source
Bien qu'il y ait beaucoup d'écrits à ce sujet, je voudrais ajouter une analogie. J'espère que vous n'aurez plus jamais de doute à l'esprit après ceci: Conclusion: les classes sont passées par référence alors que les structures sont passées par valeur.
Supposons que vous partagiez une feuille de documentation google avec votre ami. Maintenant, s'il change quoi que ce soit à cela, vous verrez également que les modifications apportées à votre document google signifient que votre copie est également affectée. C'est fondamentalement " passé par référence ".
Mais supposons que si vous avez un fichier .XLS enregistré sur votre machine. Vous fournissez ce fichier à votre ami. Maintenant, s'il apporte des modifications à ce fichier, votre fichier ne sera pas perturbé / affecté parce que vous avez votre propre copie. C'est fondamentalement " passé par valeur ". Vous disposez déjà de plusieurs programmes simples pour vérifier cette analogie dans les terrains de jeux rapides.
la source