Petit conseil énumérations dans Swift

Les énumérations constituent un modèle de conception courant dans de nombreux langages de programmation. Même si vous connaissez peut-être les énumérations en C et Objective-C, leur implémentation est nettement plus puissante et flexible. Dans cette astuce, vous apprendrez ce qui est spécial à propos des énumérations dans Swift, comment les utiliser dans vos projets et ce qui les rend si puissants..

1. Qu'est-ce qu'une énumération??

Les énumérations ne sont pas nouvelles et elles ne sont certainement pas propres à Swift. Cependant, si vous connaissez les énumérations en C, vous allez adorer la puissante interprétation de Swift sur les énumérations..

Si les énumérations ou les énumérations sont nouvelles pour vous, alors vous ne savez peut-être pas ce qu’elles ont à offrir. Dans Swift, les énumérations sont les premiers types de classe qui définissent une liste de valeurs possibles pour ce type..

Un exemple pourrait être les états possibles d'une connexion réseau. Les états possibles pourraient être:

  • débranché
  • de liaison
  • connecté

Nous pourrions ajouter un quatrième état pour le cas où l'état est inconnu. Avec cet exemple en tête, voyons comment définir et implémenter une telle énumération.

Les bases

Comme je l'ai dit, les énumérations sont des types de première classe dans Swift. Une définition d'énumération ressemble beaucoup à une définition de classe ou de structure. Dans l'exemple ci-dessous, nous définissons le État de connexion énumération.

enum ConnectionState 

Le nom de l'énumération est précédé du enum mot-clé et suivi d'une paire d'accolades. le État de connexion l'énumération définira les états possibles d'une connexion réseau. Pour définir ces états, nous ajoutons valeurs membres ou membres à la définition de l'énumération. La définition d'une valeur de membre commence toujours par le Cas mot-clé.

enum ConnectionState cas inconnu Cas déconnecté Cas de connexion connecté

En C ou en Objective-C, l'énumération ci-dessus serait légèrement différente, comme illustré dans l'exemple ci-dessous. Chaque valeur de l'énumération correspond à un entier, par exemple, ConnectionStateUnknown équivaut à 0, ConnectionStateDisconnected équivaut à 1, etc.

typedef enum: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;

Ce n'est pas vrai dans Swift. Les membres d'une énumération ne correspondent pas automatiquement à une valeur entière. Les membres du État de connexion énumération sont des valeurs elles-mêmes et elles sont de type État de connexion. Cela rend le travail avec les énumérations plus sûr et plus explicite.

Valeurs brutes

Il est possible de spécifier explicitement les valeurs des membres d'une énumération. Dans l'exemple suivant, les membres du État de connexion les énumérations ont une valeur brute de type Int. Chaque membre se voit attribuer une valeur brute, correspondant à un entier.

enum ConnectionState: Int cas inconnu = -1 cas Déconnecté = 0 cas Connexion = 1 cas Connecté = 2

Notez que nous spécifions le type des valeurs brutes dans la définition de l'énumération et qu'aucune valeur de deux membres ne peut avoir la même valeur brute. Si nous spécifions seulement une valeur pour le Inconnu membre, alors Swift augmentera automatiquement la valeur du Inconnu membre et attribuez des valeurs uniques aux autres membres de l'énumération. Pour mieux illustrer cela, l’exemple ci-dessous est identique à la définition précédente du État de connexion énumération.

enum ConnectionState: Int case Unknown = -1 case Cas déconnecté Cas de connexion Connecté

2. Travailler avec des énumérations

Initialisation

En utilisant le État de connexion l'énumération est similaire à l'utilisation de tout autre type dans Swift. Dans l'exemple suivant, nous déclarons une variable, état de connexion, et mettre sa valeur à ConnectionState.Connecting.

var connectionState = ConnectionState.Connecting

La valeur de état de connexion est ConnectionState.Connecting et la variable est de type État de connexion.

L'inférence de type de Swift est très pratique pour travailler avec des énumérations. Parce que nous avons déclaré état de connexion comme étant de type État de connexion, nous pouvons maintenant assigner une nouvelle valeur en utilisant la syntaxe abrégée des points pour les énumérations.

connectionState = .Connecté

Flux de contrôle

Utiliser des énumérations dans un si ou commutateur déclaration est simple. Rappelez-vous que commutateur les déclarations doivent être exhaustives. Ajouter un défaut cas si nécessaire.

enum ConnectionState cas inconnu Cas cas connecté Cas de connexion Connecté var connectionState = ConnectionState.Connecting connectionState = .Connected switch connectionState cas .Disconnected: println (casse), connexion. print ("Connecté") par défaut: println ("État inconnu")

L’exemple suivant montre comment le État de connexion Enum peut être utilisé. Il montre également comment accéder à la valeur associée d'un membre enum. le canConnect fonction accepte un État de connexion exemple et retourne un Bool.

func canConnect (connectionState: ConnectionState) -> Bool var result = false switch switchState case .Connected (port: let): si port == 3000 result = true défaut: result = false résultat let state = ConnectionState. Connecté (3000) si canConnect (état) //…

le canConnect la fonction ne renvoie que vrai si la État de connexion instance passée à la fonction est égale à .Connecté et sa valeur associée est un Int égal à 3000. Notez que la valeur associée de la Connecté membre est disponible dans le commutateur déclaration en tant que constante nommée Port, que nous pouvons ensuite utiliser dans le correspondant Cas.

3. Valeurs associées

Une autre caractéristique convaincante des enums Swift sont les valeurs associées. Chaque membre d'une énumération peut avoir une valeur associée. Les valeurs associées sont très flexibles. Par exemple, les valeurs associées de différents membres du même enum n'ont pas besoin d'être du même type. Regardez l'exemple suivant pour mieux comprendre le concept de valeurs associées..

enum ConnectionState cas inconnu Cas cas déconnecté Connexion (Int, Double) cas Connecté (Int)

le Inconnu et Débranché les membres n'ont pas de valeur associée. leDe liaison membre a une valeur associée de type (Int, Double), spécifiant le numéro de port et l'intervalle de temporisation de la connexion. le Connecté membre a une valeur associée de type Int, spécifiant le numéro de port.

Il est important de comprendre qu'une valeur associée est liée ou associée à un membre de l'énumération. La valeur du membre reste inchangée. L’exemple suivant montre comment créer un État de connexion instance avec une valeur associée.

var connectionState = ConnectionState.Connecting (3000, 30.0)

4. Méthodes et types de valeur

Les méthodes

Les énumérations sont assez puissantes dans Swift. Les énumérations peuvent même définir des méthodes, telles qu'un initialiseur pour sélectionner une valeur de membre par défaut si aucune n'a été spécifiée.

enum ConnectionState cas inconnu Cas déconnecté Connexion connexion (Int, Double) cas Connecté (Int) init () self = .Unknown var connectionState = ConnectionState () // .Unknown

Dans cet exemple, nous initialisons une instance du État de connexion énumération sans spécifier explicitement une valeur pour celle-ci. Dans l'initialiseur de l'énumération, cependant, nous avons défini l'instance sur Inconnu. Le résultat est que le état de connexion variable est égale à ConnectionState.Unknown.

Types de valeur

Comme les structures, les énumérations sont des types de valeur, ce qui signifie qu'une énumération n'est pas passée par référence, comme les instances de classe, mais par valeur. L'exemple suivant illustre cette.

var connectionState1 = ConnectionState () var connectionState2 = connectionState1 connectionState1 = .Connected (1000) println (connectionState1) // .Connected (1000) println (connectionState2) // .Unknown

Même si nous assignons état de connexion1 à connectionState2, les valeurs de état de connexion1 et connectionState2 sont différents à la fin de l'exemple.

Quand état de connexion1 est assigné à connectionState2, Swift crée une copie de état de connexion1 et attribue cela à connectionState2. En d'autres termes, état de connexion1 et connectionState2 se référer à deux différents État de connexion les instances.

Conclusion

Les énumérations dans Swift sont incroyablement puissantes comparées à, par exemple, les énumérations de C. L'un des aspects les plus puissants des énumérations est qu'elles constituent des types de première classe dans Swift. La sécurité des caractères est un aspect clé de la langue Swift et les énumérations s’inscrivent parfaitement dans cet état d’esprit.