Swift propose deux grandes catégories de nombres : les entiers et les nombres à virgule flottante.
0, 1, -1, 42 et -273.0.0, 3.14 et -1.36969e-10.Tu peux insérer des tirets bas dans les littéraux numériques pour en améliorer la lisibilité : 1_000_000 est identique à 1000000.
Les littéraux à virgule flottante peuvent s'écrire en notation décimale ou exponentielle.
Dans la plupart des cas, on utilise Int pour les entiers et Double pour les nombres à virgule flottante :
let speed: Int = 42 // Explicit Int
let pi: Double = 3.14 // Explicit Double
let giga: Double = 1_000_000_000 // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34 // Double in scientific notation
Swift fournit les opérateurs arithmétiques standards pour les calculs numériques :
| Opérateur | Description | Exemple |
|---|---|---|
+ |
Addition |
4 + 6 donne 10
|
- |
Soustraction |
15 - 10 donne 5
|
* |
Multiplication |
2 * 3 donne 6
|
Swift est un langage à typage sûr : il n'autorise pas le mélange de types numériques différents dans les opérations arithmétiques.
Tu ne peux pas additionner ou multiplier directement un Int et un Double ; tu dois d'abord convertir l'un des deux types pour qu'il corresponde à l'autre.
L'opérateur / effectue la division.
Quand les deux opérandes sont des entiers, la division entière tronque toute partie fractionnaire :
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
Diviser un nombre à virgule flottante non nul par zéro donne inf ou -inf.
Diviser 0.0 par 0.0 produit nan (Not a Number).
En revanche, diviser un entier par zéro provoque une erreur à la compilation ou à l'exécution :
print(5.0 / 0.0) // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0) // Prints nan
// The following line will not compile:
// print(5 / 0) // Error: Division by zero
L'opérateur de reste (%) calcule le reste de la division de deux entiers :
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
En Swift, % est un véritable opérateur de reste, et non un opérateur modulo.
Le résultat porte toujours le signe du premier opérande (le dividende), quel que soit le signe du second :
5 % -2 // 1
-5 % 2 // -1
Tu peux arrondir un nombre à virgule flottante avec la méthode rounded().
Par défaut, rounded() arrondit à l'entier le plus proche.
Tu peux aussi fournir une règle d'arrondi précise, comme .up ou .down :
let x = 3.14
let y = x.rounded() // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up) // 4.0
Quand tu déclares une constante ou une variable numérique sans annotation de type, Swift en déduit le type :
Int.Double.let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
Pour effectuer des opérations entre des valeurs de types différents, convertis l'une des valeurs à l'aide d'initialiseurs de type comme Double(_:) ou Int(_:) :
let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0
let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)
Dans cet exercice, tu vas écrire du code pour aider un freelance à communiquer avec ses clients au sujet des tarifs de certains projets. Tu vas écrire quelques fonctions utilitaires pour calculer rapidement les coûts pour les clients.
Un client contacte le freelance pour se renseigner sur ses tarifs. Le freelance lui explique qu'il travaille 8 heures par jour. Cependant, le freelance ne connaît que son tarif horaire pour le projet. Aide-le à estimer un tarif journalier à partir d'un tarif horaire.
Implémente la fonction dailyRateFrom(hourlyRate:), qui prend l'argument hourlyRate contenant le tarif horaire du freelance.
La fonction doit renvoyer le tarif journalier calculé à partir du tarif horaire.
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
Le tarif journalier renvoyé doit être un Double.
Il arrive qu'un client souhaite engager le freelance pour une période plus longue. Le freelance est prêt à accorder une remise au client, mais seulement si celui-ci l'engage pour au moins un mois. Il y a en tout 22 jours travaillés. Aide le freelance à calculer son tarif mensuel, arrondi à l'entier le plus proche, à partir de son tarif horaire et du pourcentage de remise qu'il est prêt à accorder sur le tarif plein.
Implémente la fonction monthlyRateFrom(hourlyRate:withDiscount:), qui prend les arguments hourlyRate, le tarif horaire du freelance, et withDiscount, la remise que le freelance est prêt à accorder au client.
La fonction doit renvoyer le tarif mensuel arrondi à l'entier le plus proche.
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
Un autre jour, un chef de projet propose au freelance de travailler sur un projet avec un budget fixe. Étant donné le budget fixe et le tarif horaire du freelance, aide-le à calculer le nombre de jours qu'il travaillerait jusqu'à épuisement du budget. Tiens compte du fait que dans ce scénario, le freelance est toujours prêt à accorder la remise, quel que soit le nombre de jours travaillés. Le résultat doit être arrondi à l'entier inférieur.
Implémente la fonction workdaysIn(budget:hourlyRate:withDiscount:), qui prend les arguments :
budget, le budget du projet.hourlyRate, le tarif horaire du freelance.withDiscount, la remise que le freelance est prêt à accorder au client.La fonction doit renvoyer le nombre de jours travaillés du freelance sur le projet, arrondi à l'entier inférieur.
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
Inscris-toi sur Exercism pour apprendre et maîtriser Swift avec 35 concepts116 exercices, et un vrai mentorat humain, le tout gratuitement.