92 votes

Constantes Swift: Struct ou Enum

Je ne suis pas sûr ce qui à la fois sont de mieux définir des constantes. Une structure ou un enum. Une structure sera copié à chaque fois que je l'utilise ou pas? Quand je pense à une structure avec des static let des constantes, il n'a pas de sens qu'il sera copié tous les temps, à mon avis. Mais si elle n'est pas copié puis il n'a pas d'importance ce que je prends?

Quels sont les avantages du choix d'une structure ou enum?

Francisco de dire l'utilisation Struct.

Ray Wunderlich dire l'utilisation d'Enum. Mais je n'ai pas la justification.

147voto

Martin R Points 105727

À la fois les structures et les énumérations de travail. Comme un exemple, les deux

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

et

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

de travail et de définir une propriété statique PhysicalConstants.speedOfLight.

Re: Une struct seront copiés à chaque fois que je l'utilise ou pas?

Les deux struct et enum sont des types de valeur de sorte que ne s'appliquent les énumérations. Mais c'est hors de proposici parce que vous n'avez pas à créer de la valeur à tous: Propriétés statiques (également appelé type de propriétés) 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'une structure ou enum?

Comme mentionné dans le lié à l'article:

L'avantage de l'utilisation d'un cas moins énumération, c'est qu'il ne peut pas accidentellement être instancié et fonctionne comme un simple espace de noms.

Ainsi, pour une structure,

let foo = PhysicalConstants()

crée un (inutile) valeur type PhysicalConstants, mais pour les cas moins énumération, il ne parvient pas à compiler:

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

24voto

jglasse Points 799

Voici une réponse brève: vos constantes doivent-elles être uniques? Ensuite, utilisez une énumération qui l’impose.

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

11voto

Tim Fuqua Points 538

En utilisant Xcode 7.3.1 et Swift 2.2

Alors que je suis d'accord avec Martin de R, et le Rayon Wenderlich guide de style qui fait un bon point que les énumérations sont mieux dans presque tous les cas d'utilisation à cause d'un pur espace de noms, il y a un endroit où l'utilisation d'un struct atouts enums.

Les instructions Switch

Commençons par la structure de la version:

struct StaticVars {
    static let someString = "someString"
}

switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}

À l'aide d'un struct, ce match et imprimer Matched StaticVars.someString.

Maintenant, considérons le sans douille enum version (en changeant seulement le mot-clé struct de enum):

enum StaticVars {
    static let someString = "someString"
}

switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}

Vous remarquerez que vous obtiendrez une erreur de compilation dans l'instruction switch sur l' case StaticVars.someString: ligne de. L'erreur est - Enum case 'someString' not found in type 'String'.

Il y a une pseudo-solution de contournement par la conversion de la propriété statique à une fermeture qui retourne le type de la place.

Donc vous devez le modifier comme ceci:

enum StaticVars {
    static let someString = { return "someString" }
}

switch "someString" {
case StaticVars.someString(): print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}

Note de la nécessité pour les parenthèses dans l'instruction de cas, parce que c'est maintenant une fonction.

L'inconvénient est que maintenant que nous avons une fonction, il est exécuté à chaque fois qu'il est invoqué. Donc, si c'est juste une simple type primitif comme String ou Int, ce n'est pas si mal. Il s'agit essentiellement d'une propriété calculée. Si c'est une constante qui doit être calculé et vous ne voulez calculer la fois, pensez à l'informatique dans une propriété différente et retourner que déjà la valeur calculée à la fermeture.

Vous pouvez également remplacer la valeur par défaut de l'initialiseur avec un privé, et ensuite, vous aurez le même genre d'erreur de compilation de bonté comme avec les douilles combustibles enum.

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

Mais avec cela, vous voulez placer la déclaration de la structure dans son propre fichier, parce que si vous avez déclaré dans le même fichier, comme par exemple, un Affichage de Contrôleur de classe, la classe du fichier serait encore en mesure de accidentellement instancier un inutile instance de StaticVars, mais en dehors de la classe du fichier qu'il fonctionne comme prévu. Mais c'est votre appel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X