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..
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:
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.
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.
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é
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é
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
.
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)
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
.
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.
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.