Les génériques en Swift permettent de créer des fonctions, des structures et des classes qui peuvent travailler avec n’importe quel type sans sacrifier la sécurité du type. Cela favorise la réutilisation du code en évitant la duplication.
// Fonction générique pour échanger deux valeurs de n'importe quel type
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
// Utilisation de la fonction générique
var x = 5
var y = 10
swapValues(&x, &y)
print("x: \(x), y: \(y)") // Affiche "x: 10, y: 5"
var a = "Hello"
var b = "World"
swapValues(&a, &b)
print("a: \(a), b: \(b)") // Affiche "a: World, b: Hello"
Dans cet exemple, la fonction swapValues est générique grâce à l’utilisation de <T> après son nom. Cela signifie que la fonction peut être utilisée avec n’importe quel type. Lors de l’appel de la fonction, le type est inféré automatiquement.
// Définition d'une classe générique
class Container<T> {
var items: [T] = []
func addItem(_ item: T) {
items.append(item)
}
func getItem(at index: Int) -> T? {
guard index >= 0, index < items.count else {
return nil
}
return items[index]
}
}
// Utilisation de la classe générique avec des objets de différents types
let intContainer = Container<Int>()
intContainer.addItem(5)
intContainer.addItem(10)
print(intContainer.getItem(at: 0)) // Affiche "Optional(5)"
let stringContainer = Container<String>()
stringContainer.addItem("Hello")
stringContainer.addItem("World")
print(stringContainer.getItem(at: 1)) // Affiche "Optional(World)"