Дженерики

В мире языков программирования существует парадигма обобщенной разработки. Она заключается в возможности создавать алгоритмы, одинаково работающие с разными, заранее неизвестными типами входных данных.

Для ее реализации Swift обладает дженериками, которые уже в полной мере задействованы в стандартной библиотеке. Например, массивы и словари, где тип элементов неизвестен вплоть до инициализации, построены с ними.

Можно сказать, что методы, структуры и классы, написанные с применением дженериков, способны принимать типы в качестве параметров и использовать их в коде.

import UIKit

// Generic struct
struct SuperSet<T> {
    let array = [T]()
}

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

let superset = SuperSet<Int>()

var a: Int = 1
var b: Int = 2

swapTwoValues(&a, &b)

var c: CGFloat = 3.0
var d: CGFloat = 4.0

swapTwoValues(&c, &d)

В дополнение, параметры дженериков допускают ограничение по наследованию от определенных классов и соответствию протоколам. Для этого предназначена конструкция where.

import UIKit

protocol Swiftable {
    func swift()
}

func addSwiftableView<T where T: UIView, T: Swiftable>(swiftableView: T) {
    // Some code...
}