Introduction à Swift
Swift est un langage de programmation moderne, sûr et performant créé par Apple en 2014. Swift est conçu pour remplacer Objective-C et offre une syntaxe claire, une sécurité de type, et des performances élevées. Swift est open-source et peut être utilisé pour développer des applications iOS, macOS, watchOS, tvOS, et même des applications serveur.
🍎 Qu'est-ce que Swift ?
Swift est un langage de programmation compilé, multi-paradigme et type-safe. Swift combine les meilleures fonctionnalités des langages modernes avec une syntaxe claire et expressive.
💡 Pourquoi Swift est si populaire ?
- Développement iOS/macOS - Langage officiel pour les applications Apple
- Syntaxe moderne - Code clair et expressif, facile à lire et maintenir
- Sécurité - Type-safe, gestion automatique de la mémoire, optionals
- Performance - Compilé, performances proches du C
- Open-source - Développement communautaire actif
- SwiftUI - Framework moderne pour créer des interfaces utilisateur
🚀 Pourquoi apprendre Swift ?
Swift offre de nombreuses opportunités :
- ✅ Développement iOS - Créer des applications pour iPhone et iPad
- ✅ Développement macOS - Applications natives pour Mac
- ✅ Très demandé - Forte demande de développeurs Swift
- ✅ Salaire élevé - Salaires attractifs dans l'écosystème Apple
- ✅ SwiftUI - Framework moderne et déclaratif
- ✅ Communauté active - Support et ressources abondantes
📋 Prérequis pour apprendre Swift
Pour apprendre Swift efficacement, il est recommandé d'avoir :
- ✅ Mac ou iPad - Pour développer avec Xcode (recommandé)
- ✅ Concepts de base - Variables, conditions, boucles
- ✅ Xcode - IDE officiel d'Apple (gratuit)
💡 Note importante : Pour développer avec Swift, vous avez besoin de Xcode (gratuit sur le Mac App Store). Vous pouvez aussi utiliser Swift Playgrounds sur iPad ou des environnements en ligne comme Repl.it.
🎯 Cas d'usage de Swift
Swift est utilisé pour :
- Applications iOS - Applications iPhone et iPad
- Applications macOS - Applications natives pour Mac
- watchOS - Applications pour Apple Watch
- tvOS - Applications pour Apple TV
- Serveur - Développement backend avec Vapor
- Scripts - Automatisation sur macOS
📝 Syntaxe de base
Swift a une syntaxe moderne et claire. Swift utilise des accolades {} pour définir les blocs de code et est type-safe.
// Premier programme Swift
print("Bonjour, monde !")
// Variables
let nom = "NiangProgrammeur"
let age = 25
// String interpolation pour formater les chaînes
print("Je m'appelle \(nom) et j'ai \(age) ans")
// Opérations simples
let resultat = 10 + 5
print("10 + 5 = \(resultat)")
💡 Points importants sur la syntaxe Swift :
- Swift utilise des accolades
{}pour définir les blocs de code - Les commentaires utilisent
//pour une ligne, ou/* */pour plusieurs lignes - Swift est case-sensitive (majuscules/minuscules importantes)
- Les instructions se terminent généralement sans point-virgule (optionnel)
- Swift utilise l'inférence de type (type inference)
🔍 Exemple de code Swift
Voici un exemple montrant la syntaxe de base de Swift :
// Définition d'une fonction
func calculerMoyenne(_ nombres: [Double]) -> Double {
// Calcule la moyenne d'un tableau de nombres
guard !nombres.isEmpty else {
return 0
}
let somme = nombres.reduce(0, +)
let moyenne = somme / Double(nombres.count)
return moyenne
}
// Utilisation
let notes: [Double] = [15, 18, 12, 20, 16]
let moyenne = calculerMoyenne(notes)
print("La moyenne est : \(moyenne)")
🔤 Variables et Constantes
En Swift, vous utilisez var pour les variables (modifiables) et let pour les constantes (non modifiables).
// Déclaration de variables et constantes
var nom = "Swift" // String (chaîne de caractères) - variable
let age = 30 // Int (entier) - constante
let prix = 19.99 // Double (nombre décimal) - constante
var estActif = true // Bool (booléen) - variable
var valeurNulle: String? = nil // Optional (peut être nil)
// Affichage
print(nom)
print(age)
print(prix)
print(estActif)
print(valeurNulle ?? "nil")
// Réassignation (seulement pour var)
var variable = 10
print(type(of: variable)) // Int
variable = 20 // OK car var
// age = 31 // Erreur : let est immuable
// Noms de variables valides (camelCase)
let nomUtilisateur = "Bassirou"
let ageUtilisateur = 25
let _prive = "variable privée"
let CONSTANTE = 3.14159 // Convention pour les constantes
📌 Règles pour les variables :
- Utilisez
varpour les variables modifiables - Utilisez
letpour les constantes (recommandé) - Le type peut être explicite ou inféré
- Les noms de variables sont en camelCase
📊 Types de données
Swift propose plusieurs types de données : Int, Double, String, Bool, Array, Dictionary, etc.
// Types de base
let texte: String = "Hello" // String (chaîne de caractères)
let nombre: Int = 42 // Int (entier)
let decimal: Double = 3.14 // Double (nombre décimal)
let booleen: Bool = true // Bool (booléen)
let valeurNulle: String? = nil // Optional (peut être nil)
// Collections (structures de données)
var liste: [Int] = [1, 2, 3, 4, 5] // Array (tableau ordonné, modifiable)
let tuple = (1, 2, 3) // Tuple (liste ordonnée, immuable)
var dictionnaire: [String: Any] = ["nom": "Swift", "age": 30] // Dictionary (paires clé-valeur)
var ensemble: Set<Int> = [1, 2, 3, 4] // Set (ensemble unique, non ordonné)
// Vérifier le type
print(type(of: texte)) // String
print(type(of: nombre)) // Int
print(type(of: liste)) // Array<Int>
print(type(of: dictionnaire)) // Dictionary<String, Any>
// Conversion de types
let ageStr = String(25) // Convertir en String
let ageInt = Int("25") // Convertir en Int (Optional)
let prixDouble = Double("19.99") // Convertir en Double (Optional)
📚 Types de données Swift :
- Int, Int8, Int16, Int32, Int64 - Nombres entiers signés
- UInt, UInt8, UInt16, UInt32, UInt64 - Nombres entiers non signés
- Float, Double - Nombres décimaux (virgule flottante)
- String - Chaînes de caractères
- Bool - Booléens (true/false)
- Array - Tableaux ordonnés
- Dictionary - Dictionnaires (paires clé-valeur)
- Set - Ensembles (valeurs uniques)
- Optional - Types optionnels (peuvent être nil)
🔢 Opérateurs
Swift supporte les opérateurs arithmétiques, de comparaison, logiques et d'assignation.
// Opérateurs arithmétiques
let a = 10
let b = 3
print(a + b) // Addition: 13
print(a - b) // Soustraction: 7
print(a * b) // Multiplication: 30
print(a / b) // Division: 3.3333333333333335
print(a / b) // Division entière: utiliser Int(a / b) pour 3
print(a % b) // Modulo (reste): 1
print(pow(Double(a), Double(b))) // Puissance: 1000.0
// Opérateurs de comparaison
print(a > b) // true (supérieur à)
print(a < b) // false (inférieur à)
print(a >= b) // true (supérieur ou égal)
print(a <= b) // false (inférieur ou égal)
print(a == b) // false (égalité)
print(a != b) // true (différent)
// Opérateurs logiques
let x = true
let y = false
print(x && y) // false (ET logique)
print(x || y) // true (OU logique)
print(!x) // false (NON logique)
// Opérateurs d'assignation
var c = 5
c += 3 // Équivalent à c = c + 3 (c devient 8)
c -= 2 // Équivalent à c = c - 2 (c devient 6)
c *= 2 // Équivalent à c = c * 2 (c devient 12)
c /= 3 // Équivalent à c = c / 3 (c devient 4)
// Comparaison d'identité (===)
let liste1 = [1, 2, 3]
let liste2 = [1, 2, 3]
let liste3 = liste1
print(liste1 === liste2) // false (objets différents)
print(liste1 === liste3) // true (même référence)
print(liste1 == liste2) // true (valeurs égales)
🔀 Structures de contrôle
Swift utilise if, if-else, switch pour les conditions.
// Structure if simple
let age = 20
if age >= 18 {
print("Vous êtes majeur")
} else {
print("Vous êtes mineur")
}
// Structure if/else if/else
let age2 = 15
if age2 >= 18 {
print("Vous êtes majeur")
print("Vous pouvez voter")
} else if age2 >= 13 {
print("Vous êtes adolescent")
} else if age2 >= 6 {
print("Vous êtes enfant")
} else {
print("Vous êtes un bébé")
}
// Conditions multiples
let note = 85
let mention: String
if note >= 90 {
mention = "Excellent"
} else if note >= 80 {
mention = "Très bien"
} else if note >= 70 {
mention = "Bien"
} else if note >= 60 {
mention = "Assez bien"
} else {
mention = "Insuffisant"
}
print("Votre mention : \(mention)")
// Opérateur ternaire (expression conditionnelle)
let age3 = 20
let statut = age3 >= 18 ? "Majeur" : "Mineur"
print(statut)
// Conditions avec &&/||
let age4 = 25
let permis = true
if age4 >= 18 && permis {
print("Vous pouvez conduire")
} else {
print("Vous ne pouvez pas conduire")
}
🔄 Boucles
Swift propose for-in, while, et repeat-while pour les boucles.
// Boucle for-in avec range
for i in 0..<5 {
print(i) // Affiche 0, 1, 2, 3, 4
}
// Range avec début et fin (fermé)
for i in 1...5 {
print(i) // Affiche 1, 2, 3, 4, 5
}
// Range avec pas (stride)
for i in stride(from: 0, to: 10, by: 2) {
print(i) // Affiche 0, 2, 4, 6, 8
}
// Boucle for-in avec tableau
let fruits = ["pomme", "banane", "orange"]
for fruit in fruits {
print("J'aime les \(fruit)")
}
// Boucle for-in avec index (enumerated)
let fruits2 = ["pomme", "banane", "orange"]
for (index, fruit) in fruits2.enumerated() {
print("\(index): \(fruit)")
}
// Boucle while
var compteur = 0
while compteur < 5 {
print(compteur)
compteur += 1
}
// Boucle while avec break
var compteur2 = 0
while true {
print(compteur2)
compteur2 += 1
if compteur2 >= 5 {
break // Sortir de la boucle
}
}
// continue (passer à l'itération suivante)
for i in 0..<10 {
if i % 2 == 0 { // Si i est pair
continue // Passer au suivant
}
print(i) // Affiche seulement les impairs: 1, 3, 5, 7, 9
}
// repeat-while (équivalent do-while)
var compteur3 = 0
repeat {
print(compteur3)
compteur3 += 1
} while compteur3 < 5
⚙️ Fonctions
Les fonctions en Swift sont définies avec func et peuvent avoir des paramètres nommés.
// Fonction simple (sans paramètres)
func direBonjour() {
print("Bonjour !")
}
direBonjour() // Appel de la fonction
// Fonction avec paramètres
func saluer(_ nom: String) -> String {
return "Bonjour, \(nom) !"
}
let message = saluer("Swift")
print(message) // "Bonjour, Swift !"
// Fonction avec plusieurs paramètres
func additionner(_ a: Int, _ b: Int) -> Int {
return a + b
}
let resultat = additionner(5, 3)
print(resultat) // 8
// Fonction avec paramètres par défaut
func saluerPersonne(_ nom: String, message: String = "Bonjour") -> String {
return "\(message), \(nom) !"
}
print(saluerPersonne("Bassirou")) // "Bonjour, Bassirou !"
print(saluerPersonne("Bassirou", message: "Salut")) // "Salut, Bassirou !"
// Fonction avec labels de paramètres
func creerPersonne(nom: String, age: Int, ville: String = "Dakar") -> String {
return "\(nom), \(age) ans, habite à \(ville)"
}
print(creerPersonne(nom: "Bassirou", age: 25))
print(creerPersonne(nom: "Bassirou", age: 25, ville: "Thiès"))
// Fonction avec variadic parameters
func additionnerNombres(_ nombres: Int...) -> Int {
return nombres.reduce(0, +)
}
print(additionnerNombres(1, 2, 3, 4, 5)) // 15
// Closure (fonction anonyme)
let carre: (Int) -> Int = { x in x * x }
print(carre(5)) // 25
// Utilisation de map() avec closure
let nombres = [1, 2, 3, 4, 5]
let carres = nombres.map { $0 * $0 }
print(carres) // [1, 4, 9, 16, 25]
📋 Collections
Swift propose Array, Set, et Dictionary pour stocker des collections de données.
// ========== ARRAYS ==========
// Création de tableaux
var nombres: [Int] = [1, 2, 3, 4, 5]
var fruits: [String] = ["pomme", "banane", "orange"]
var listeMixte: [Any] = [1, "deux", 3.0, true]
// Accès aux éléments (index commence à 0)
print(fruits[0]) // "pomme" (premier élément)
print(fruits[fruits.count - 1]) // "orange" (dernier élément)
// Modification
fruits[1] = "mangue" // Remplacer "banane" par "mangue"
// Méthodes des tableaux
fruits.append("kiwi") // Ajouter à la fin
fruits.insert("ananas", at: 1) // Insérer à l'index 1
if let index = fruits.firstIndex(of: "pomme") {
fruits.remove(at: index) // Supprimer un élément
}
fruits.pop() # Supprimer le dernier élément
fruits.pop(0) # Supprimer l'élément à l'index 0
# Autres méthodes utiles
print(len(fruits)) # Longueur de la liste
print(fruits.count("banane")) # Compter les occurrences
fruits.sort() # Trier la liste
fruits.reverse() # Inverser la liste
# Slicing (tranches)
nombres = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nombres[2:5]) # [2, 3, 4] (de l'index 2 à 4)
print(nombres[:3]) # [0, 1, 2] (du début à l'index 2)
print(nombres[3:]) # [3, 4, 5, 6, 7, 8, 9] (de l'index 3 à la fin)
print(nombres[::2]) # [0, 2, 4, 6, 8] (tous les 2 éléments)
# ========== DICTIONNAIRES ==========
# Création de dictionnaires
personne = {
"nom": "Bassirou",
"age": 25,
"ville": "Dakar"
}
# Accès aux valeurs
print(personne["nom"]) # "Bassirou"
print(personne.get("age")) # 25 (méthode get() plus sûre)
print(personne.get("email", "Non renseigné")) # Valeur par défaut
# Modification et ajout
personne["age"] = 26 # Modifier
personne["email"] = "bassirou@example.com" # Ajouter
# Méthodes des dictionnaires
print(personne.keys()) # Toutes les clés
print(personne.values()) # Toutes les valeurs
print(personne.items()) # Toutes les paires clé-valeur
# Parcourir un dictionnaire
for cle, valeur in personne.items():
print(f"{cle}: {valeur}")
# Supprimer
del personne["email"] # Supprimer une clé
personne.pop("ville") # Supprimer et retourner la valeur
📦 Programmation Orientée Objet
Swift supporte les classes, structures, énumérations, et protocoles pour la POO.
# Importer un module complet
import math
print(math.sqrt(16)) # 4.0 (racine carrée)
print(math.pi) # 3.141592653589793
print(math.cos(0)) # 1.0
# Importer avec un alias
import datetime as dt
maintenant = dt.datetime.now()
print(maintenant)
# Importer des fonctions spécifiques
from math import sqrt, pi
print(sqrt(25)) # 5.0
print(pi) # 3.141592653589793
# Importer tout d'un module (non recommandé)
from math import *
print(sin(0)) # 0.0
# Modules standards utiles
import random
print(random.randint(1, 100)) # Nombre aléatoire entre 1 et 100
import os
print(os.getcwd()) # Répertoire courant
import sys
print(sys.version) # Version de swift
# Créer son propre module
# Créer un fichier mon_module.py avec :
# def ma_fonction():
# return "Hello from module"
#
# Puis l'importer :
# import mon_module
# print(mon_module.ma_fonction())
🏗️ Protocoles et Extensions
Les protocoles définissent des contrats, et les extensions permettent d'ajouter des fonctionnalités.
# Définir une classe
class Personne:
# Constructeur (méthode spéciale __init__)
def __init__(self, nom, age):
self.nom = nom # Attribut d'instance
self.age = age
# Méthode d'instance
def se_presenter(self):
return f"Je m'appelle {self.nom} et j'ai {self.age} ans"
def avoir_ans(self, annees):
self.age += annees
return f"Dans {annees} ans, j'aurai {self.age} ans"
# Créer des objets (instances)
personne1 = Personne("Bassirou", 25)
personne2 = Personne("Aminata", 30)
# Utiliser les méthodes
print(personne1.se_presenter())
print(personne2.se_presenter())
print(personne1.avoir_ans(5))
# Accéder aux attributs
print(personne1.nom)
print(personne1.age)
# Classe avec attributs de classe
class Voiture:
# Attribut de classe (partagé par toutes les instances)
nombre_voitures = 0
def __init__(self, marque, modele):
self.marque = marque
self.modele = modele
Voiture.nombre_voitures += 1
def __str__(self):
return f"{self.marque} {self.modele}"
voiture1 = Voiture("Toyota", "Corolla")
voiture2 = Voiture("Honda", "Civic")
print(f"Nombre de voitures créées : {Voiture.nombre_voitures}")
# Héritage
class Etudiant(Personne):
def __init__(self, nom, age, ecole):
super().__init__(nom, age) # Appeler le constructeur parent
self.ecole = ecole
def etudier(self):
return f"{self.nom} étudie à {self.ecole}"
etudiant = Etudiant("Bassirou", 25, "UCAD")
print(etudiant.se_presenter()) # Méthode héritée
print(etudiant.etudier()) # Méthode spécifique
📁 Gestion d'erreurs
Swift utilise do-catch et try pour gérer les erreurs de manière sûre.
# Écrire dans un fichier (mode 'w' = write)
with open("fichier.txt", "w", encoding="utf-8") as f:
f.write("Bonjour swift !\n")
f.write("Ceci est la deuxième ligne\n")
# Lire un fichier (mode 'r' = read)
with open("fichier.txt", "r", encoding="utf-8") as f:
contenu = f.read()
print(contenu)
# Lire ligne par ligne
with open("fichier.txt", "r", encoding="utf-8") as f:
for ligne in f:
print(ligne.strip()) # strip() enlève les sauts de ligne
# Lire toutes les lignes dans une liste
with open("fichier.txt", "r", encoding="utf-8") as f:
lignes = f.readlines()
print(lignes)
# Ajouter à un fichier (mode 'a' = append)
with open("fichier.txt", "a", encoding="utf-8") as f:
f.write("Nouvelle ligne ajoutée\n")
# Modes de fichier
# 'r' - Lecture (défaut)
# 'w' - Écriture (écrase le fichier existant)
# 'a' - Ajout (ajoute à la fin)
# 'x' - Création exclusive (erreur si existe)
# 'b' - Mode binaire (rb, wb)
# 't' - Mode texte (défaut, rt, wt)
# '+' - Lecture et écriture (r+, w+, a+)
# Gestion d'erreurs
try:
with open("fichier_inexistant.txt", "r") as f:
contenu = f.read()
except FileNotFoundError:
print("Le fichier n'existe pas")
except PermissionError:
print("Permission refusée")
except Exception as e:
print(f"Erreur : {e}")
💡 Bonne pratique : Utilisez let pour les constantes par défaut, et var seulement quand vous devez modifier la valeur. Swift encourage l'immutabilité pour la sécurité.
🎓 Prochaines étapes
Félicitations ! Vous avez maintenant une solide base en Swift.
✅ Ce que vous avez appris :
- Syntaxe Swift et variables
- Types de données (Int, Double, String, Bool)
- Opérateurs et structures de contrôle
- Fonctions et closures
- Collections (Array, Set, Dictionary)
- Programmation Orientée Objet
- Protocoles et extensions
- Gestion d'erreurs
🚀 Pour aller plus loin :
- SwiftUI - Framework moderne pour les interfaces
- Combine - Programmation réactive
- Core Data - Persistance des données
- Networking - Requêtes API avec URLSession
- Concurrency - async/await pour la programmation asynchrone