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..
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.
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..
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..
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")
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.
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é.
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")
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..
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.
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
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!