Constantes rapides: Struct ou Enum

Je ne suis pas sûr de savoir lequel des deux est le mieux pour définir des constantes. Un struct ou un enum. Une structure sera copiée à chaque fois que je l’utilise ou non? Quand je pense à une structure avec static let constantes de lettrage static let cela n’a aucun sens qu’elle soit copiée tout le temps, à mon avis. Mais si cela ne copie pas, alors peu importe ce que je prends?

Quels sont les avantages du choix d’un struct ou d’un enum?

Francisco dit utiliser Struct.

Ray Wunderlich dit utiliser Enum’s. Mais je manque de justification.

Les structures et les énumérations fonctionnent. A titre d’exemple, les deux

 struct PhysicalConstants { static let speedOfLight = 299_792_458 // ... } 

et

 enum PhysicalConstants { static let speedOfLight = 299_792_458 // ... } 

travailler et définir une propriété statique PhysicalConstants.speedOfLight .

Re: Une structure sera copiée chaque fois que je l’utilise ou non?

struct et enum sont tous deux des types de valeur qui s’appliquent également aux énumérations. Mais cela n’a rien à voir ici car vous n’avez pas à créer de valeur du tout: les propriétés statiques (également appelées propriétés de type ) sont des propriétés du type lui-même et non d’une instance de ce type.

Re: Quels avantages a le choix d’un struct ou enum?

Comme mentionné dans l’article lié :

L’avantage d’utiliser une énumération sans casse est qu’elle ne peut pas être instanciée accidentellement et fonctionne comme un espace de noms pur.

Donc, pour une structure,

 let foo = PhysicalConstants() 

crée une valeur (inutile) de type PhysicalConstants , mais pour une énumération sans casse, la compilation échoue:

 let foo = PhysicalConstants() // error: 'PhysicalConstants' cannot be constructed because it has no accessible initializers 

Voici une réponse courte: vos constantes doivent-elles être uniques? Ensuite, utilisez un enum, qui l’applique.

Voulez-vous utiliser plusieurs constantes différentes pour contenir la même valeur (souvent utile pour plus de clarté)? Ensuite, utilisez une structure qui permet cela.

Utiliser Xcode 7.3.1 et Swift 2.2

Bien que je sois d’accord avec Martin R, et que le guide de style de Ray Wenderlich montre bien que les énumérations sont meilleures dans presque tous les cas d’utilisation, car il s’agit d’un pur espace de nommage,

Changer les déclarations

Commençons par la version struct:

 struct StaticVars { static let someSsortingng = "someSsortingng" } switch "someSsortingng" { case StaticVars.someSsortingng: print("Matched StaticVars.someSsortingng") default: print("Didn't match StaticVars.someSsortingng") } 

En utilisant une structure, cela correspondra et imprimera Matched StaticVars.someSsortingng .

Considérons maintenant la version d’énumération sans casse (en changeant seulement le mot struct clé struct en enum ):

 enum StaticVars { static let someSsortingng = "someSsortingng" } switch "someSsortingng" { case StaticVars.someSsortingng: print("Matched StaticVars.someSsortingng") default: print("Didn't match StaticVars.someSsortingng") } 

Vous remarquerez que vous obtenez une erreur de compilation dans l’instruction switch sur le case StaticVars.someSsortingng: line. L’erreur est Enum case 'someSsortingng' not found in type 'Ssortingng' .

Il existe une solution de pseudo-solution en convertissant la propriété statique en une fermeture qui renvoie le type à la place.

Donc tu changerais comme ça:

 enum StaticVars { static let someSsortingng = { return "someSsortingng" } } switch "someSsortingng" { case StaticVars.someSsortingng(): print("Matched StaticVars.someSsortingng") default: print("Didn't match StaticVars.someSsortingng") } 

Notez le besoin de parenthèses dans la déclaration de cas car il s’agit maintenant d’une fonction.

L’inconvénient est que maintenant que nous en avons fait une fonction, elle est exécutée à chaque fois qu’elle est invoquée. Donc, si ce n’est qu’un simple type primitif comme Ssortingng ou Int , ce n’est pas si grave. C’est essentiellement une propriété calculée. Si c’est une constante qui doit être calculée et que vous voulez seulement la calculer une fois, envisagez de la calculer dans une propriété différente et de renvoyer cette valeur déjà calculée dans la fermeture.

Vous pouvez également remplacer l’initialiseur par défaut par un programme privé, et vous obtiendrez le même type d’erreur de compilation que le décompte sans casse.

 struct StaticVars { static let someSsortingng = "someSsortingng" private init() {} } 

Mais avec ceci, vous voudriez mettre la déclaration de la structure dans son propre fichier, parce que si vous le déclariez dans le même fichier que, par exemple, une classe View Controller, le fichier de cette classe serait toujours capable d’instancier accidentellement un fichier inutile. instance de StaticVars , mais en dehors du fichier de la classe, cela fonctionnerait comme prévu. Mais c’est ton appel.