Ответ
Generics позволяют писать типобезопасный и переиспользуемый код, избегая дублирования.
1. Функции с Generics:
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = 5, y = 10
swapValues(&x, &y) // x = 10, y = 5
2. Кастомные типы с Generics:
struct Stack<Element> {
private var elements = [Element]()
mutating func push(_ element: Element) {
elements.append(element)
}
mutating func pop() -> Element? {
return elements.popLast()
}
}
var intStack = Stack<Int>()
intStack.push(42)
3. Ограничения типов (Type Constraints):
func findIndex<T: Equatable>(of value: T, in array: [T]) -> Int? {
return array.firstIndex { $0 == value }
}
4. Протоколы с Associated Types:
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
}
Преимущества:
- Типобезопасность — компилятор проверяет типы
- Производительность — нет накладных расходов как с
Any - Переиспользование кода — одна реализация для разных типов
Использование в стандартной библиотеке:
Array<Element>Dictionary<Key, Value>Optional<Wrapped>