Универсальные функции Swift: изучение методов гибкости типов

Вот несколько методов, связанных с универсальными функциями Swift:

  1. Общие функции: Swift позволяет определять функции, которые могут работать с разными типами, используя обобщенные функции. Используя универсальные параметры, вы можете создавать функции, достаточно гибкие для обработки различных типов входных данных.

Пример:

func swapValues<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}
var num1 = 5
var num2 = 10
swapValues(&num1, &num2)
print("num1 =", num1) // Output: num1 = 10
print("num2 =", num2) // Output: num2 = 5
var str1 = "Hello"
var str2 = "World"
swapValues(&str1, &str2)
print("str1 =", str1) // Output: str1 = World
print("str2 =", str2) // Output: str2 = Hello
  1. Ограничения типов. Вы можете применять ограничения к параметрам универсального типа, чтобы ограничить типы, которые можно использовать с универсальной функцией. Это гарантирует, что функция будет работать только с типами, отвечающими определенным требованиям.

Пример:

func processArray<T: Numeric>(_ array: [T]) -> T {
    var result: T = 0
    for element in array {
        result += element
    }
    return result
}
let numbers = [1, 2, 3, 4, 5]
let sum = processArray(numbers)
print("Sum:", sum) // Output: Sum: 15
let doubles = [1.5, 2.5, 3.5]
let total = processArray(doubles)
print("Total:", total) // Output: Total: 7.5
  1. Общие типы: помимо универсальных функций Swift также поддерживает универсальные типы. Вы можете определить общие структуры, классы и перечисления, которые могут работать с разными типами.

Пример:

struct Stack<T> {
    private var elements: [T] = []

    mutating func push(_ element: T) {
        elements.append(element)
    }

    mutating func pop() -> T? {
        return elements.popLast()
    }
}
var stack = Stack<Int>()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.pop()) // Output: Optional(3)
print(stack.pop()) // Output: Optional(2)
print(stack.pop()) // Output: Optional(1)