Swift From Scratch Introduction aux fonctions

Pour réussir quelque chose dans Swift, vous devez apprendre les rouages ​​des fonctions. Les fonctions sont exceptionnellement puissantes et flexibles dans Swift. Les bases sont simples, surtout si vous avez déjà travaillé avec d’autres langages de programmation. Mais à cause de la syntaxe flexible de Swift, les fonctions peuvent devenir déroutantes si vous n'êtes pas familiarisé avec les bases. 

Dans cet article, nous nous concentrons d'abord sur les bases. Nous explorerons ensuite la syntaxe plus complexe et les cas d'utilisation dans le prochain article. Il est important de ne pas négliger les bases car elles sont essentielles pour comprendre d'où vient le pouvoir d'une fonction. Commençons par disséquer l'anatomie d'une fonction dans Swift avec un exemple.

1. Apprendre par l'exemple

Une fonction n'est rien d'autre qu'un bloc de code pouvant être exécuté à tout moment. Regardons un exemple de l'anatomie de base d'une fonction de Swift. Lancez Xcode et créez un nouveau terrain de jeu. Ajouter la définition de fonction suivante au terrain de jeu.

func printHelloWorld () print ("Bonjour tout le monde!")

Une fonction commence par le func mot-clé et est suivi du nom de la fonction, printHelloWorld dans notre exemple. Comme dans beaucoup d'autres langages, le nom de la fonction est suivi d'une paire de parenthèses contenant les paramètres de la fonction - l'entrée de la fonction.

Le corps de la fonction est enveloppé dans une paire d'accolades. le printHelloWorld () fonction contient une seule instruction qui imprime la chaîne Bonjour le monde! à la sortie standard. Voici à quoi ressemble une fonction de base dans Swift. La syntaxe est simple, propre et minimaliste.

Vous pouvez appeler la fonction en tapant le nom de la fonction, suivi d'une paire de parenthèses.

printHelloWorld ()

2. paramètres

Rendons l'exemple un peu plus complexe en ajoutant des paramètres à la définition de la fonction. Cela signifie simplement que nous fournissons à la fonction des valeurs d'entrée pouvant être utilisées dans le corps de la fonction. Dans l'exemple suivant, nous définissons le printMessage (message :) fonction, qui accepte un paramètre, message, de type Chaîne.

func printMessage (message: String) print (message)

Une fonction peut accepter plusieurs paramètres ou valeurs d'entrée. Les paramètres sont entourés par les parenthèses qui suivent le nom de la fonction. Le nom du paramètre est suivi de deux points et du type du paramètre. Comme vous vous en souvenez, cela ressemble beaucoup à la déclaration d'une variable ou d'une constante. Il dit simplement que le message paramètre est de type Chaîne.

Au lieu d’imprimer une chaîne codée en dur comme nous l’avons fait dans le printHelloWorld () fonction, nous imprimons le message la valeur du paramètre. Cela rend la fonction flexible et plus utile.

Invoquer la fonction est très similaire à ce que nous avons vu précédemment. La seule différence est que nous passons un argument lorsque nous appelons la fonction.

printMessage (message: "Hello World!")

Notez que les termes paramètres et arguments sont souvent utilisés de manière interchangeable, mais il existe une différence sémantique subtile en Swift. Dans Swift, les paramètres sont les valeurs spécifiées dans la définition de la fonction, tandis que les arguments sont les valeurs transmises à la fonction lorsqu'elle est appelée..

Paramètres multiples

Comme je l'ai mentionné précédemment, la syntaxe des fonctions est très flexible et vous ne devriez pas être surpris qu'il soit parfaitement possible de passer plusieurs arguments à une fonction. Dans l'exemple suivant, nous créons une variation sur le printMessage (message: times :) fonction qui nous permet d'imprimer le message plusieurs fois.

func printMessage (message: String, times: Int) pour i dans 0… 

Bien que le nom de la fonction soit identique à celui de l'original printMessage (message :) fonction, le type de la fonction est différent. 

Il est important que vous compreniez la phrase précédente. Relire le.

Chaque fonction a un type, composé des types de paramètre et du type de retour. Nous allons explorer les types de retour dans un instant. Les fonctions peuvent avoir le même nom tant que leur type est différent, comme indiqué par les deux définitions de fonction précédentes.

Le type de la première fonction est (Chaîne) -> (), tandis que le type de la deuxième fonction est(String, Int) -> (). Le nom des deux fonctions est identique. Ne t'inquiète pas pour le -> symbole. Sa signification deviendra claire dans quelques instants lorsque nous discuterons des types de retour.

La deuxième printMessage (message: times :) fonction définit deux paramètres, message de type Chaîne et fois de type Int. Cette définition illustre l’une des caractéristiques que Swift a adoptées à partir d’Objective-C: noms de fonctions et de méthodes lisibles. Alors que le nom de la fonction est printMessage, il est facile de comprendre ce que la fonction est supposée faire en lisant les noms des paramètres de la fonction.

Dans la seconde printMessage (message: times :) fonction, nous créons un pour-dans boucle pour imprimer le message chaîne fois fois. Nous utilisons l'opérateur de gamme semi-ouvert, … <, comme nous l'avons vu plus tôt dans cette série.

Quand on commence à taper printMessage Dans la cour de récréation, Xcode affiche les deux fonctions dans le menu de complétion automatique. Grâce au type de fonction, il est facile de choisir la fonction qui nous intéresse. printMessage (message: times :) la fonction est aussi simple que:

printMessage (message: "Hello World", fois: 3)

Les valeurs par défaut

L'une de mes fonctionnalités préférées est la possibilité de définir des valeurs par défaut pour les paramètres. Cela peut sembler idiot si vous venez d'une langue qui propose cette fonctionnalité depuis des lustres, mais c'est plutôt bien si vous travaillez avec C et Objective-C depuis de nombreuses années..

En bref, Swift permet aux développeurs de définir des valeurs par défaut pour les paramètres d’une fonction. Définissons une nouvelle fonction qui imprime la date du jour dans un format spécifique. Assurez-vous d’ajouter la déclaration d’importation suivante en haut de votre terrain de jeu pour importer le framework UIKit..

importer UIKit

Définissons d'abord le printDate (date: format :) fonction sans utiliser les valeurs par défaut pour aucun des paramètres.

func printDate (date: date, format: String) let dateFormatter = DateFormatter () dateFormatter.dateFormat = format print (dateFormatter.string (from: date))

Si vous n'êtes pas familier avec le framework Foundation et que vous ne comprenez pas ce qui se passe dans le corps de la fonction, c'est très bien. Cet exemple ne met pas l'accent sur la mise en œuvre du formatage d'une date. Dans printDate (date: format :), nous utilisons la valeur de la format paramètre pour formater la valeur de rendez-vous amoureux. Si nous ne transmettons pas de valeur pour le format paramètre, le compilateur renvoie une erreur.

Nous pouvons y remédier en définissant une valeur par défaut pour le deuxième paramètre de la fonction, comme indiqué dans la définition de fonction mise à jour ci-dessous..

func printDate (date: date, format: String = "YY / MM / jj") let dateFormatter = DateFormatter () dateFormatter.dateFormat = format print (dateFormatter.string (à partir de: date))

Définir une valeur par défaut est aussi simple que de spécifier une valeur dans la liste des paramètres de la définition de la fonction. Le résultat est que le compilateur ne se plaint plus et que l'erreur disparaît.

printDate (date: date ())

Même si nous avons spécifié une valeur par défaut pour le format paramètre, on peut toujours passer une valeur si on veut.

printDate (date: date (), format: "jj / mm / aa")

Notez qu'Apple recommande de positionner les paramètres avec une valeur par défaut à la fin de la liste des paramètres. C'est certainement une bonne idée et commune à la plupart des autres langages de programmation qui prennent en charge les paramètres facultatifs.

3. Type de retour

Les fonctions que nous avons vues jusqu'à présent ne nous retournent rien lorsque nous les invoquons. Faisons le printDate (date: format :) function est plus utile en renvoyant la date formatée sous forme de chaîne, au lieu d'imprimer la date formatée dans le corps de la fonction. Cela nécessite deux changements, comme vous pouvez le voir ci-dessous.

func printDate (date: date, format: String = "YY / MM / jj") -> String let dateFormatter = DateFormatter () dateFormatter.dateFormat = le format de retour dateFormatter.string (à partir de: date)

La première chose que nous changeons est la définition de la fonction. Après la liste des paramètres, nous spécifions le type de retour, Chaîne. Le type de retour est précédé du -> symbole. Si vous avez travaillé avec CoffeeScript, cela vous semblera familier.

Au lieu d’imprimer la date formatée en utilisant le print (_: separator: terminator :) fonction, nous utilisons le revenir mot-clé pour retourner la valeur de la fonction. C'est tout ce que nous devons faire. Essayons-le.

let formattedDate = printDate (date: date (), format: "jj / mm / aa") print (date formatée)

Nous invoquons le printDate (date: format :) fonction, stocke la valeur renvoyée dans la constante date formatée, et imprimer la valeur de date formatée dans la sortie standard. Notez que le nom du printDate (date: format :) la fonction ne reflète plus ce qu’elle fait, alors vous voudrez peut-être la changer en formatDate au lieu.

Aucun type de retour

Les autres fonctions que nous avons définies dans ce tutoriel n'avaient pas de type de retour. Lorsqu'une fonction n'a pas de type de retour, il n'est pas nécessaire d'inclure le -> symbole dans la définition de la fonction.

Quelques paragraphes plus tôt, je vous ai dit qu'aucune des fonctions que nous avions définies ne nous retournait de valeur. Ce n'est pas tout à fait vrai. Permettez-moi d'expliquer les détails sérieux avec une expérience. Ajoutez la ligne suivante à votre terrain de jeu et voyez ce qui se passe.

C'est intéressant. Swift n'a pas de problème à ce que nous stockions la valeur de retour du printHelloWorld () fonctionne dans une constante, mais il nous avertit que le type de la valeur renvoyée n'est pas ce que nous pourrions penser.

Qu'est-ce qu'il se passe ici? Chaque fonction de Swift renvoie une valeur, même si nous ne définissons pas de type de retour dans la définition de la fonction. Quand une fonction ne spécifie pas explicitement un type de retour, la fonction retourne implicitement Vide, qui équivaut à un tuple vide, ou () pour faire court. Vous pouvez le voir dans le volet de sortie du terrain de jeu et cela est également mentionné dans l'avertissement, les sorties du compilateur.

Nous pouvons nous débarrasser de l’avertissement ci-dessus en déclarant explicitement le type de valeur, un tuple vide. Je conviens qu'il n'est pas très utile de stocker un tuple vide dans une constante, mais cela vous montre que chaque fonction a une valeur de retour.

let value: () = printHelloWorld ()

Tuples

Une autre fonctionnalité intéressante de Swift est la possibilité de renvoyer plusieurs valeurs d’une fonction en renvoyant un tuple. L'exemple suivant montre comment cela fonctionne. Permettez-moi de répéter que ce n'est pas important que vous compreniez comment le timeComponentsForDate (date :) la fonction fait son travail. Le focus est la valeur de retour de la fonction, un tuple avec trois éléments.

func timeComponentsForDate (_ date: date) -> (heure: Int, minute: Int, seconde: Int) let dateComponents = Calendar.current.dateComponents ([. heure, .minute, .second], à partir de: date) let heure = dateComponents.hour let minute = dateComponents.minute let second = dateComponents.seconde retour (heure ?? 0, minute ?? 0, seconde ?? 0)

La fonction accepte un argument, un Rendez-vous amoureux exemple, et retourne un tuple avec trois valeurs étiquetées. Étiqueter les valeurs du tuple est seulement pour la commodité; il est possible d'omettre les étiquettes.

func timeComponentsForDate (_ date: date) -> (Int, Int, Int) let dateComponents = Calendar.current.dateComponents ([. heure, .minute, .second], à partir de: date) let heure = dateComponents.hour let minute = dateComponents.minute let second = dateComponents.seconde déclaration (heure ?? 0, minute ?? 0, seconde ?? 0)

Cependant, comme l'illustre l'exemple suivant, il est très pratique de nommer les valeurs du tuple renvoyé par la fonction et rend votre code plus facile à comprendre..

let timeComponents = timeComponentsForDate (Date ()) print (timeComponents.hour) print (timeComponents.minute) print (timeComponents.second)

Il est également possible de renvoyer une valeur optionnelle à partir d'une fonction s'il existe des scénarios dans lesquels la fonction n'a pas de valeur à renvoyer. Ceci est aussi simple que de définir le type de retour de la fonction comme facultatif, comme indiqué ci-dessous.

func timeComponentsForDate (_ date: Date) -> (heure: Int, minute: Int, seconde: Int)? let dateComponents = Calendar.current.dateComponents ([. heure, .minute, .second], à partir de: date) guard let hour = dateComponents.hour else return nil guard let minute = dateComponents.minute else return nil guard let second = dateComponents.second else return nil return (heure, minute, seconde)

Conclusion

Dans ce tutoriel, nous avons exploré les bases des fonctions de Swift. Il est important que vous compreniez la syntaxe des fonctions, car dans le prochain article, nous explorerons des fonctions plus avancées qui s'appuient sur ce que nous avons présenté dans ce tutoriel..

Je vous encourage à relire l'article si nécessaire et, plus important encore, à écrire quelques fonctions dans un terrain de jeu pour vous familiariser avec la syntaxe. Les bases sont faciles à comprendre, mais vous ne les maîtriserez que par la pratique.

Si vous souhaitez apprendre à utiliser Swift 3 pour coder des applications réelles, consultez notre cours Créer des applications iOS avec Swift 3. Que vous débutiez dans le développement d'applications iOS ou que vous souhaitiez passer de Objective-C à un autre bien sûr, vous allez commencer avec Swift pour le développement d'applications.