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.