Как вы используете Generics (обобщения) в Swift?

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

Ответ

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>