() translation by (you can also view the original English article)
Pour obtenir quelque chose fait dans Swift, vous aurez besoin d'apprendre les tenants et aboutissants 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 en raison de la syntaxe flexible de Swift, il peut facilement devenir complexe si vous n'êtes pas familier avec les bases.
Dans cet article, nous allons nous concentrer sur ces bases d'abord et explorer la syntaxe plus complexe et les cas d'utilisation dans l'article suivant. Il est important que vous n'avez pas écrémé les bases car ils sont essentiels pour comprendre d'où vient la puissance d'une fonction chez Swift. Commençons par un exemple pour disséquer l'anatomie d'une fonction dans Swift.
1. Apprendre par exemple
Une fonction n'est rien de plus qu'un bloc de code qui peut être exécuté chaque fois qu'il est nécessaire. Je voudrais commencer par un exemple pour discuter de l'anatomie de base d'une fonction Swift. Ouvrez Xcode et créez un nouveau playground. Ajoutez la définition de fonction suivante au playground.
1 |
func printHelloWorld() { |
2 |
println("Hello World!") |
3 |
}
|
Une fonction commence par le mot clé func
et est suivie par le nom de la fonction, printHelloWorld
dans notre exemple. Comme dans beaucoup d'autres langues, le nom de la fonction est suivi par une paire de parenthèses qui contiennent les paramètres de la fonction, l'entrée de la fonction.
Le corps de la fonction est enveloppé dans une paire d'accolades. La fonction printHelloWorld
contient une instruction dans laquelle nous imprimons la chaîne Hello World!
dans la sortie standard. C'est ce que ressemble une fonction de base dans Swift. La syntaxe est simple, propre et minimaliste.
Vous pouvez invoquer la fonction en tapant le nom de la fonction, suivi d'une paire de parenthèses.
1 |
printHelloWorld() |
2. Paramètres
Faisons l'exemple ci-dessus 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 qu'elle peut utiliser dans le corps de la fonction. Dans l'exemple suivant, nous définissons la fonction printMessage
, qui accepte un paramètre, message
, de type String
.
1 |
func printMessage(message: String) { |
2 |
println(message) |
3 |
}
|
Une fonction peut accepter plusieurs paramètres ou valeurs d'entrée. Les paramètres sont enveloppés par les parenthèses qui suivent le nom de la fonction. Le nom du paramètre est suivi par deux points et le type du paramètre. Comme vous vous en souvenez, c'est très similaire à déclarer une variable ou une constante. Il indique simplement que le paramètre message
est de type String
.
Au lieu d'imprimer une chaîne codée comme nous l'avons fait dans la fonction printHelloWorld
, nous imprimons la valeur du paramètre message
. Cela rend la fonction flexible et plus utile.
Appeler la fonction est très similaire à ce que nous avons vu plus tôt. La seule différence est que nous passons un argument lors de l'appel de la fonction.
1 |
printMessage("Hello World!") |
Notez que les termes parameters et arguments sont souvent utilisés de façon interchangeable, mais il existe une différence sémantique subtile dans 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 passées à la fonction quand elle est appelée.
Paramètres multiples
Comme je l'ai mentionné précédemment, la syntaxe des fonctions est très flexible et il ne devrait pas vous surprendre qu'il est parfaitement possible de passer plusieurs arguments à une fonction. Dans l'exemple suivant, nous créons une variation sur la fonction printMessage
qui nous permet d'imprimer le message plusieurs fois.
1 |
func printMessage(message: String, times: Int) { |
2 |
for i in 0..<times { |
3 |
println("\(i) \(message)") |
4 |
}
|
5 |
}
|
Bien que le nom de la fonction soit identique à celui de la fonction printMessage
d'origine, le type de la fonction est différent. Il est important que vous compreniez la phrase précédente. Relisez le.
Chaque fonction possède un type, composé des types de paramètres et du type de retour. Nous explorerons les types de retour dans un instant. Les fonctions peuvent avoir le même nom tant que leur type est différent, comme le montrent les deux définitions de fonctions précédentes.
Le type de la première fonction est (String) -> ()
tandis que le type de la deuxième fonction est (String, Int) -> ()
. Le nom des deux fonctions est le même. Ne vous inquiétez pas du symbole ->
. Sa signification deviendra claire dans quelques instants quand nous discuterons des types de retour.
La seconde fonction printMessage
définit deux paramètres, type de message
String
et times
de type Int
. Cette définition illustre l'une des caractéristiques que Swift a adoptées à partir des noms de fonctions/méthodes lisibles par Objective-C. Alors que le nom de la fonction est printMessage
, en lisant les noms des paramètres de la fonction, il est facile de comprendre ce que la fonction est supposée faire.
Dans la deuxième fonction printMessage
, nous créons une boucle for-in
pour imprimer la chaîne de message
times
fois. Nous utilisons l'opérateur de plage semi-ouverte, .. <
, comme nous l'avons vu précédemment dans ces séries.



Lorsque nous commençons à taper printMessage
dans le playground, Xcode affiche les deux fonctions dans le menu de saisie automatique. Grâce au type de fonction, il est facile de choisir la fonction qui nous intéresse. Appeler la seconde fonction printMessage
est aussi simple que:
1 |
printMessage("Hello World", 3) |
Les valeurs par défaut
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 ridicule si vous venez d'une langue qui a eu cette fonctionnalité pour des lutres, mais c'est très bien si vous avez travaillé avec C et Objective-C pendant 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 actuelle dans un format spécifique. Assurez-vous d'ajouter l'instruction import suivante en haut de votre playground pour importer la structure UIKit.
1 |
import UIKit |
Définissons d'abord la fonction printDate
sans utiliser les valeurs par défaut de l'un des paramètres.
1 |
func printDate(date: NSDate, format: String) { |
2 |
let dateFormatter = NSDateFormatter() |
3 |
dateFormatter.dateFormat = format |
4 |
println(dateFormatter.stringFromDate(date)) |
5 |
}
|
Si vous n'êtes pas familier avec le cadre de la Fondation et vous ne comprenez pas ce qui se passe dans le corps de la fonction, alors c'est très bien. L'objectif de cet exemple n'est pas de mettre en œuvre la mise en forme de la date. Dans printDate
, nous utilisons la valeur du paramètre format
pour formater la valeur de date
. Si nous ne transmettons pas une valeur pour le paramètre de format
, Swift nous le fera savoir en lançant une erreur.



Nous pouvons remédier à cela 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.
1 |
func printDate(date: NSDate, format: String = "YY/MM/dd") { |
2 |
let dateFormatter = NSDateFormatter() |
3 |
dateFormatter.dateFormat = format |
4 |
println(dateFormatter.stringFromDate(date)) |
5 |
}
|
Définir une valeur par défaut est aussi simple que de spécifier une valeur dans la liste des paramètres dans la définition de la fonction. Le résultat est que Swift ne se plaindra plus et l'erreur disparaîtra.
1 |
printDate(NSDate()) |
Que faire si nous voulons transmettre une valeur pour le paramètre de format
? Essayons et voyons ce que Swift nous dit.



Parce que le paramètre de format
a une valeur par défaut et est donc facultatif, nous devons transmettre le nom de l'argument pour indiquer à Swift à quel paramètre nous faisons référence. Le correctif est très simple, comme vous pouvez le voir ci-dessous.
1 |
printDate(NSDate(), format: "dd/MM/YY") |
Notez que 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 dans 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'ici ne nous renvoient rien quand nous les invoquons. Rendons la fonction printDate
plus utile en renvoyant la date formatée sous forme de chaîne, au lieu d'imprimer la date formatée à partir de la fonction. Cela nécessite deux changements, comme vous pouvez le voir ci-dessous.
1 |
func printDate(date: NSDate, format: String = "YY/MM/dd") -> String { |
2 |
let dateFormatter = NSDateFormatter() |
3 |
dateFormatter.dateFormat = format |
4 |
return dateFormatter.stringFromDate(date) |
5 |
}
|
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, String
. Le type de retour est précédé du symbole ->
. Si vous avez travaillé avec CoffeeScript, cela vous paraîtra familier.
Au lieu d'imprimer la date formatée à l'aide de la fonction println
, nous utilisons le mot-clé return
pour retourner la valeur de la fonction. C'est tout ce que nous devons faire. Essayons.
1 |
let formattedDate = printDate(NSDate(), format: "dd/MM/YY") |
2 |
|
3 |
println(formattedDate) |
Nous appelons la fonction printDate
, stocker la valeur renvoyée dans la constante formattedDate
, et imprimer la valeur de formattedDate
dans la sortie standard. Notez que le nom de la fonction printDate
ne reflète plus ce qu'il fait, vous pouvez donc le modifier en formatDate
.
Aucun type de retour
Les autres fonctions que nous avons définies dans ce tutoriel n'ont 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 nous a rendu une valeur. Ce n'est pas tout à fait vrai. Permettez-moi d'expliquer les détails de notions de base avec une expérience. Ajoutez la ligne suivante à votre playground et voyez ce qui se passe.



C'est intéressant. Swift n'a pas de problème que nous stockons la valeur de retour de la fonction printHelloWorld
dans une constante, mais il se plaint qu'il est incapable d'inférer le type de la constante de value
.
Qu'est-ce qu'il se passe ici? Chaque fonction dans Swift renvoie une valeur, même si nous ne définissons pas un type de retour dans la définition de la fonction. Lorsqu'une fonction ne spécifie pas explicitement un type de retour, la fonction renvoie implicitement Void
, ce qui équivaut à un tuple vide, ou ()
à court. Vous pouvez le voir dans le panneau de sortie du playground comme indiqué dans la capture d'écran ci-dessus.
Nous pouvons nous débarrasser de l'avertissement ci-dessus en déclarant explicitement le type de value
, un tuple vide. Je conviens qu'il n'est pas très utile de stocker un tuple vide dans une constante, mais il vous montre que chaque fonction a une valeur de retour.
1 |
let value: () = printHelloWorld() |
Tuples
Une autre grande caractéristique de Swift est la possibilité de retourner plusieurs valeurs d'une fonction en renvoyant un tuple. L'exemple suivant illustre comment cela fonctionne. Permettez-moi de répéter qu'il n'est pas important que vous compreniez comment la fonction timeComponentsForDate
effectue son travail. Le focus est la valeur de retour de la fonction timeComponentsForDate
, un tuple à trois éléments.
1 |
func timeComponentsForDate(date: NSDate) -> (hour: Int, minute: Int, second: Int) { |
2 |
let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date) |
3 |
let hour = dateComponents.hour |
4 |
let minute = dateComponents.minute |
5 |
let second = dateComponents.second |
6 |
return (hour, minute, second) |
7 |
}
|
La fonction accepte un argument, une instance NSDate
, et retourne un tuple avec trois valeurs marquées. L'étiquetage des valeurs du tuple est seulement pour des raisons de commodité, il est possible d'omettre les étiquettes.
1 |
func timeComponentsForDate(date: NSDate) -> (Int, Int, Int) { |
2 |
let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date) |
3 |
let hour = dateComponents.hour |
4 |
let minute = dateComponents.minute |
5 |
let second = dateComponents.second |
6 |
return (hour, minute, second) |
7 |
}
|
Cependant, comme l'illustre l'exemple suivant, étiqueter les valeurs du tuple retourné par la fonction est très pratique et rend votre code plus facile à comprendre.
1 |
let timeComponents = timeComponentsForDate(NSDate()) |
2 |
|
3 |
println(timeComponents.hour) |
4 |
println(timeComponents.minute) |
5 |
println(timeComponents.second) |
Il est également possible de retourner une valeur facultative à partir d'une fonction s'il existe des scénarios dans lesquels la fonction n'a aucune valeur à retourner. C'est aussi simple que de définir le type de retour de la fonction comme facultatif comme indiqué ci-dessous.
1 |
func timeComponentsForDate(date: NSDate) -> (hour: Int, minute: Int, second: Int)? { |
2 |
let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date) |
3 |
let hour = dateComponents.hour |
4 |
let minute = dateComponents.minute |
5 |
let second = dateComponents.second |
6 |
return (hour, minute, second) |
7 |
}
|
Conclusion
Dans ce tutoriel, nous nous sommes concentrés sur les bases des fonctions dans Swift. Il est important que vous compreniez la syntaxe des fonctions, car dans l'article suivant, nous explorerons des fonctions plus avancées qui s'appuient sur ce que nous avons abordé dans ce tutoriel.
Je vous encourage à lire l'article à nouveau si nécessaire et, plus important encore, écrire quelques fonctions dans un playground pour se familiariser avec la syntaxe. Les bases sont faciles à comprendre, mais vous obtenez seulement le coup en pratiquant.