Generics позволяют тебе писать гибкий, переиспользуемый код, который работает с любым типом, вместо того чтобы быть привязанным к конкретному. Это ключевая возможность Swift, и она лежит в основе большей части его стандартной библиотеки.
Обобщённая функция использует параметр типа (обычно T) как заполнитель для реального типа:
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
Эта единственная функция работает с Int, String или любым другим типом — без всяких перегрузок.
Ты можешь также определить обобщённые типы — например, структуры или классы:
struct Stack<Element> {
private var items: [Element] = []
mutating func push(_ item: Element) { items.append(item) }
mutating func pop() -> Element? { items.popLast() }
}
Ограничения типов задают, какие именно типы допустимы, делая generics мощнее и безопаснее:
func findMax<T: Comparable>(_ array: [T]) -> T? {
return array.max()
}
Здесь T должен соответствовать протоколу Comparable.
Стандартная библиотека Swift активно использует generics:
Array<Element> хранит элементы любого типаOptional<Wrapped> представляет наличие или отсутствие значенияDictionary<Key, Value> отображает ключи на значенияОбобщённая функция с параметром типа вроде <T> может принимать любой тип без необходимости перегрузки функций, что делает код более переиспользуемым и поддерживаемым.
Новый — ещё не проверен сообществом
Вы