Ответ
Generics (обобщения) позволяют писать гибкий, типобезопасный код, который может работать с любыми типами, сохраняя строгую проверку типов на этапе компиляции.
Пример 1: Универсальная функция
// Функция меняет местами два значения любого типа
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = 5
var y = 10
swapValues(&x, &y) // Работает с Int
print(x, y) // 10 5
var str1 = "Hello"
var str2 = "World"
swapValues(&str1, &str2) // Работает с String
print(str1, str2) // World Hello
Пример 2: Универсальный тип (Generic Type)
// Универсальная структура Stack
struct Stack<Element> {
private var items: [Element] = []
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element? {
return items.popLast()
}
}
// Использование с разными типами
var intStack = Stack<Int>()
intStack.push(1)
intStack.push(2)
print(intStack.pop()!) // 2
var stringStack = Stack<String>()
stringStack.push("Swift")
Ключевые моменты:
TиElement— это параметры типа (type parameters), заполнители для реальных типов.- Компилятор подставляет конкретные типы, обеспечивая типобезопасность.
- Generics устраняют необходимость дублирования кода для разных типов.