Generics — это механизм, который позволяет писать универсальные функции и типы, работающие с любыми типами данных, сохраняя при этом полную типобезопасность.
🤔 Зачем нужны дженерики?
🔹 Уменьшают дублирование кода:
Больше не нужно писать отдельные функции для Int, Float и других типов — один обобщённый вариант заменит их все.
🔹 Обеспечивают типобезопасность:
Компилятор проверяет типы на этапе компиляции, предотвращая ошибки в рантайме.
🔹 Повышают переиспользуемость:
Один алгоритм можно применять к разным типам данных без изменений.
⚠️ Как работают дженерики?
Дженерики используют параметры типа (обычно обозначаются <T>, <Element> и т. д.), которые заменяются конкретными типами при компиляции.
♣️ Пример использования:
func plusValue<T: Numeric>(first: T, second: T) -> T {
return first + second
}
let a = 5
let b = 10
print(plusValue(first: a, second: b)) // 15
let c = 0.5
let d = 3.0
print(plusValue(first: c, second: d)) // 3.0
//
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(1)
var stringStack = Stack<String>()
stringStack.push("Swift")
❌ Ограничения дженериков:
Иногда нужно указать, что тип T должен соответствовать определённым требованиям. Для этого используют протоколы:
func plusValue<T: Numeric>(first: T, second: T) -> T {
return first + second
}
Здесь T должен являться числом (Numeric), иначе код не скомпилируется.
➡️ Подписаться на канал
Мобильный трудоголик