Как создать шаблонную (обобщенную) функцию в Swift?

«Как создать шаблонную (обобщенную) функцию в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Swift шаблонные функции создаются с помощью дженериков (generics). Параметр типа (например, T) позволяет функции работать с любым типом данных.

Базовый синтаксис:

func functionName<T>(_ parameter: T) -> T {
    // ... тело функции
}

Пример: функция обмена значений:

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

// Использование с разными типами:
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt) // Работает с Int

var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString) // Работает с String

Добавление ограничений (Constraints): Можно требовать, чтобы тип соответствовал определенному протоколу или классу, используя where или синтаксис :.

// Функция работает только с типами, соответствующими протоколу Numeric
func add<T: Numeric>(_ a: T, _ b: T) -> T {
    return a + b
}

let sumInt = add(5, 10) // 15
let sumDouble = add(3.14, 2.71) // 5.85
// add("a", "b") // Ошибка компиляции: String не соответствует Numeric

Дженерики применяются также к классам, структурам и перечислениям, обеспечивая безопасность типов и избегая дублирования кода.