Swift From Scratch options et flux de contrôle

Dans les articles précédents, vous avez appris certains des concepts de base du langage de programmation Swift. Si vous avez déjà programmé, je suis sûr que vous avez observé quelques similitudes avec d'autres langages de programmation, tels que Ruby, JavaScript et Objective-C..

Dans cet article, nous zoomons sur le flux de contrôle dans Swift. Avant de pouvoir discuter plus en détail du flux de contrôle, nous devons examiner un concept nouveau pour la plupart d'entre vous, les optionnels. Les options sont une autre caractéristique de sécurité de Swift. Au début, il peut sembler fastidieux d’utiliser des options, mais vous apprendrez rapidement que ces options rendront votre code beaucoup plus sûr..

1. Options

Nous avons déjà vu qu'une variable doit être initialisée avant de pouvoir être utilisée. Regardez l'exemple suivant pour mieux comprendre ce que cela signifie..

var str: String str.isEmpty

Si vous avez l'habitude de travailler avec des chaînes dans Objective-C, vous serez peut-être surpris que Swift vous indique une erreur. Voyons ce que cette erreur nous dit.

Dans de nombreuses langues, les variables ont une valeur par défaut initiale. En Objective-C, par exemple, la chaîne dans l'extrait de code suivant est égale à néant.

NSString * newString;

Cependant, le concept de néant diffère dans Swift et Objective-C. Nous discuterons néant plus en détail un peu plus tard.

Qu'est-ce qu'un facultatif??

Swift utilise des options pour encapsuler un concept important, c'est-à-dire qu'une variable ou une constante a une valeur ou pas. C'est aussi simple que ça chez Swift. Pour déclarer une variable ou une constante comme étant facultative, nous ajoutons un point d'interrogation au type de la variable ou de la constante..

var str: String?

La variable str n'est plus de type Chaîne. Il est maintenant de type optionnel Chaîne. C'est important à comprendre. Le résultat ou l’effet secondaire est que nous ne pouvons plus directement interagir avec la valeur du str variable. La valeur est stockée en toute sécurité dans l’option, et nous devons demander l’option pour la valeur qu’elle encapsule..

Déballage forcé

Un moyen d'accéder à la valeur d'un optionnel consiste à décompresser de manière forcée. On peut accéder à la valeur de la variable str en ajoutant un ! au nom de la variable.

var str: String? str = "Test" print (str!)

Il est important que vous soyez sûr que facultatif contienne une valeur lorsque vous forcez le dérouler. Si l’option n’a pas de valeur et que vous la forcez à la dérouler, Swift émettra une erreur..

Reliure optionnelle

Il existe un moyen plus sûr d’accéder à la valeur d’une option. Nous allons regarder de plus près si instructions en quelques minutes, mais l'exemple suivant montre comment accéder en toute sécurité à la valeur stockée dans la variable str, qui est de type optionnel Chaîne.

var str: String? si str! = nil print (str!) else print ("str n'a aucune valeur")

Nous vérifions d'abord si la variable str est égal à néant avant d'imprimer son contenu. Dans cet exemple, str n'a pas de valeur, ce qui signifie qu'il ne sera pas forcé sans emballage par accident.

Il existe une approche plus élégante appelée liaison facultative. Dans l’exemple suivant, nous affectons la valeur stockée dans la valeur optionnelle à une constante temporaire utilisée dans la si déclaration. La valeur de l'option str est lié à la constante strConst et utilisé dans le si déclaration. Cette approche fonctionne également pour tandis que des déclarations.

var str: String? str = "Test" si laissez strConst = str print (strConst) sinon print ("str n'a pas de valeur")

Quel est néant?

Si vous venez d'Objective-C, alors vous savez certainement quoi néant est. En Objective-C, néant est un pointeur sur un objet qui n'existe pas. Swift définit néant un peu différemment, et il est important que vous compreniez la différence.

En rapide, néant signifie l'absence d'une valeur, n'importe quelle valeur. Tandis que néant est uniquement applicable aux objets en Objective-C, en Swift néant peut être utilisé pour n'importe quel type. Il est donc important de comprendre qu’un optionnel n’est pas l’équivalent de néant en Objective-C. Ces concepts sont très différents.

2. Flux de contrôle

Swift propose un certain nombre de constructions communes pour contrôler le flux du code que vous écrivez. Si vous avez de l'expérience en programmation, vous n'aurez aucun problème à vous familiariser avec les constructions de flux de contrôle de Swift, conditionnelles. si et commutateur déclarations, et pour et tandis que boucles.

Cependant, Swift ne serait pas Swift si son flux de contrôle ne différait pas légèrement des constructions de flux de contrôle d'Objective-C, par exemple. Bien que les détails soient importants, je suis sûr qu'ils ne vous empêcheront pas de vous familiariser avec Swift. Commençons par la construction conditionnelle la plus courante, la si déclaration.

si

Swift si les déclarations sont très similaires à celles trouvées dans Objective-C. La principale différence est qu'il n'est pas nécessaire de mettre la condition entre parenthèses. Les accolades sont cependant obligatoires. Ce dernier empêche les développeurs d’introduire des bogues courants liés à l’écriture. si déclarations sans accolades. C'est ce qu'un si déclaration ressemble à Swift.

Soit a = 10 si a> 10 print ("La valeur de \" a \ "est supérieure à 10.") else print ("La valeur de \" a \ "est inférieure ou égale à 10." )

Il n’est pas surprenant que Swift définisse également une autre clause. Le code dans le autre clause est exécutée si la condition est égale à faux. Il est également possible de chaîner si déclarations comme dans l'exemple suivant.

Soit a = 10 si a> 10 print ("La valeur de \" a \ "est supérieure à 10.") sinon si a> 5 print ("La valeur de \" a \ "est supérieure à 5. ") else print (" La valeur de \ "a \" est inférieure ou égale à 5. ")

Il y a une remarque importante à faire, à savoir la condition d'un si déclaration doit retourner vrai ou faux. Ce n'est pas vrai pour si déclarations en Objective-C. Jetez un oeil à ce qui suit si déclaration en Objective-C.

NSArray * array = @ []; if (array.count) NSLog (@ "Le tableau contient un ou plusieurs éléments.");  else NSLog (@ "Le tableau est vide."); 

Si nous devions porter l'extrait de code ci-dessus vers Swift, nous rencontrerions une erreur. L’erreur n’est pas très informative, mais Swift nous dit que nous devons nous assurer que le résultat de la condition est évalué. vrai ou faux.

La bonne façon de traduire le fragment de code Objective-C ci-dessus en Swift est de s’assurer que la condition du si déclaration évalue à vrai ou faux, comme dans l'extrait suivant.

let array = [String] () si array.count> 0 print ("Le tableau contient un ou plusieurs éléments.") else print ("Le tableau est vide.")

commutateur

Swift commutateur Cette déclaration est plus puissante que son équivalent en Objective-C. C'est aussi plus sûr, comme vous l'apprendrez tout de suite. Bien qu'il y ait quelques différences, commutateur les déclarations dans Swift adhèrent au même concept que celles d'autres langages de programmation; une valeur est transmise au commutateur déclaration, et il est comparé avec les modèles d'appariement possibles.

C'est vrai, les modèles. Comme je l'ai dit, un commutateur déclaration dans Swift a quelques astuces dans sa manche. Nous allons examiner ces astuces dans un instant. Parlons d'abord de la sécurité.

Complet

UNE commutateur déclaration dans Swift doit être exhaustive, ce qui signifie que toutes les valeurs possibles du type qui est remis à la commutateur déclaration doit être traitée par le commutateur déclaration. Comme dans Objective-C, ceci est facilement résolu en ajoutant un défaut cas, comme indiqué dans l'exemple suivant.

let a = 10 change a case 0: print ("a est égal à 0") cas 1: print ("a est égal à 1") par défaut: print ("a a une autre valeur")

Tomber dans

Une différence importante avec la mise en œuvre par Objective-C de commutateur déclarations est le manque de chute implicite. L'exemple suivant ne fonctionne pas dans Swift pour plusieurs raisons.

let a = 10 change a cas 0: cas 1: print ("a est égal à 1") par défaut: print ("a a une autre valeur")

Le premier cas dans lequel une est comparé à 0 ne tombe pas implicitement dans le deuxième cas dans lequel une est comparé à 1. Si vous ajoutez l'exemple ci-dessus à votre terrain de jeu, vous remarquerez que Swift vous envoie une erreur. L'erreur indique que chaque cas doit inclure au moins une instruction exécutable..

Notez que les cas de la commutateur déclaration ne comprend pas Pause déclarations à sortir de la commutateur déclaration. Cela n’est pas nécessaire dans Swift, car l’interruption implicite n’existe pas dans Swift. Cela permettra d’éliminer une série de bugs courants provoqués par des défaillances involontaires..

Les motifs

Le pouvoir d'un commutateur déclaration dans Swift réside dans la correspondance de modèle. Regardez l'exemple suivant dans lequel j'ai utilisé des plages pour comparer la valeur considérée à.

laissez a = 10 changer un case 0… <5: print("The value of a lies between 0 and 4.") case 5… 10: print("The value of a lies between 5 and 10.") default: print("The value of a is greater than 10.") 

le … < opérateur ou opérateur de demi-ouverture de plage définit une plage allant de la première valeur à la deuxième valeur, à l'exclusion de la deuxième valeur. le opérateur ou opérateur de plage fermée définit une plage allant de la première valeur à la deuxième valeur, y compris la deuxième valeur. Ces opérateurs sont très utiles dans un large éventail de situations.

Vous pouvez également comparer la valeur considérée d'un commutateur déclaration à tuples. Regardez l'exemple suivant pour voir comment cela fonctionne..

let latlng = (34.15, -78.03) change le lnng case (0, 0): print ("Nous sommes au centre de la planète.") case (0… 90, _): print ("Nous en sommes à l'hémisphère Nord. ") cas (-90… 0, _): print (" Nous sommes dans l'hémisphère Sud. ") défaut: print (" La coordonnée n'est pas valide. ")

Comme vous pouvez le constater dans l'exemple ci-dessus, il est possible que la valeur corresponde à plusieurs observations. Lorsque cela se produit, le premier cas correspondant est choisi. L'exemple ci-dessus illustre également l'utilisation du trait de soulignement. Comme nous l'avons vu dans l'article précédent, nous pouvons utiliser un trait de soulignement, _, pour dire à Swift quelles valeurs ne nous intéressent pas.

Reliure de valeur

La liaison de valeur est également possible avec commutateur instructions, comme le montre l'exemple suivant. La deuxième valeur du tuple est temporairement liée à la constante la description à utiliser dans les premier et deuxième cas.

var response = (200, "OK") réponse du commutateur case (200… <400, let description): print("The request was successful with description \(description).") case (400… <500, let description): print("The request was unsuccessful with description \(description).") default: print("The request was unsuccessful with no description.") 

pour

le pour loop est la première construction de boucle que nous allons examiner. Il se comporte très semblable à pour boucles dans d'autres langues. Il y avait deux saveurs, la pour boucle et le pour-dans boucle. À partir de Swift 3, cependant, C-style pour les boucles ne sont plus disponibles. L'extrait suivant n'est pas possible dans Swift 3.

pour var i = 0; je < 10; i++  print("i is equal to \(i).") 

Si vous collez cet extrait dans une aire de jeux, vous remarquerez également que le ++ et -- les opérateurs ne sont plus disponibles dans Swift 3.

le pour-dans loop est idéal pour parcourir le contenu d'une plage ou d'une collection. Dans l'exemple suivant, nous parcourons les éléments d'un tableau..

laisser nombres = [1, 2, 3, 5, 8] pour un nombre dans les nombres print ("nombre est égal à \ (nombre)")

Nous pouvons aussi utiliser pour-dans Boucle en boucle sur les paires clé-valeur d'un dictionnaire. Dans l'exemple suivant, nous déclarons un dictionnaire et imprimons son contenu sur la console. Comme nous l'avons vu précédemment dans cette série, la séquence des paires clé-valeur est indéfinie puisqu'un dictionnaire est un ensemble non ordonné de paires clé-valeur..

var bids = ["Tom": 100, "Bart": 150, "Susan": 120] pour (nom, offre) dans les offres print ("L'offre de \ (nom) est $ \ (enchère).") 

Chaque paire clé-valeur du dictionnaire est disponible dans le pour-dans boucle comme un tuple de constantes nommées. le pour-dans La boucle est également idéale en combinaison avec des gammes. Je suis sûr que vous êtes d'accord pour dire que l'extrait ci-dessous est facile à lire et à comprendre grâce à l'utilisation d'une plage fermée.

pour i dans 1… 10 print ("i est égal à \ (i)")

tandis que

le tandis que boucle vient en deux saveurs, tandis que et répéter pendant que. La principale différence est que l’ensemble des déclarations d’un répéter pendant que La boucle est toujours exécutée au moins une fois, car la condition du répéter pendant que est évalué à la fin de chaque itération. L'exemple suivant illustre cette différence.

var c = 5 var d = 5 tant que c < d  print("c is smaller than d")  repeat  print("c is smaller than d")  while c < d

La déclaration d'impression du tandis que boucle n’est jamais exécutée, alors que celle de la répéter pendant que la boucle est exécutée une fois.

Dans de nombreux cas, pour les boucles peuvent être réécrites comme tandis que boucles, et il appartient souvent au développeur de déterminer le type de boucle à utiliser dans une situation donnée. Le suivant pour et tandis que les boucles donnent le même résultat.

pour i en 0… <10  print(i)  var i = 0 while i < 10  print(i) i += 1 

Conclusion

Il existe beaucoup plus de choses à contrôler dans Swift que celles décrites dans cet article, mais vous avez maintenant les connaissances de base pour continuer votre route vers Swift. J'espère que ce tutoriel vous a montré à quel point l'implémentation des flux de contrôle de Swift est très similaire à celle d'autres langages de programmation.

Dans le reste de cette série, nous utiliserons davantage les constructions de flux de contrôle de Swift et vous comprendrez progressivement mieux les différences subtiles entre Swift et des langages comme Objective-C. Dans le prochain épisode de cette série, nous commencerons à explorer les fonctions.

Si vous voulez un moyen rapide de commencer à créer des applications avec la langue Swift, nous avons un cours pour cela.!

Ou consultez nos autres tutoriels et cours sur le développement Swift et iOS!