Los genéricos son una característica poderosa de Swift que te permite escribir funciones y tipos flexibles y reutilizables. Los genéricos pueden trabajar con cualquier tipo, sujeto a las restricciones que definas. En esta sección, aprenderás cómo funcionan los genéricos y cómo puedes utilizarlos para escribir código más robusto y reutilizable.
Conceptos Clave
- Definición de Genéricos: Los genéricos permiten que las funciones y los tipos trabajen con cualquier tipo de datos.
- Parámetros Genéricos: Los parámetros genéricos se definen utilizando un nombre de tipo genérico entre corchetes angulares (
<T>). - Restricciones de Tipo: Puedes restringir los tipos que se pueden usar con tus genéricos utilizando cláusulas
where.
Ejemplo Básico de Función Genérica
Vamos a empezar con un ejemplo simple de una función genérica que intercambia dos valores:
Explicación del Código
func swapTwoValues<T>(_ a: inout T, _ b: inout T): Aquí,Tes un parámetro de tipo genérico. La funciónswapTwoValuespuede trabajar con cualquier tipoT.inout: Indica que los parámetrosaybpueden ser modificados dentro de la función.let temporaryA = a: Guarda el valor deaen una variable temporal.a = b: Asigna el valor debaa.b = temporaryA: Asigna el valor temporal (original dea) ab.
Uso de la Función Genérica
var int1 = 3
var int2 = 107
swapTwoValues(&int1, &int2)
print("int1: \(int1), int2: \(int2)") // int1: 107, int2: 3
var string1 = "hello"
var string2 = "world"
swapTwoValues(&string1, &string2)
print("string1: \(string1), string2: \(string2)") // string1: world, string2: helloTipos Genéricos
Además de funciones, también puedes definir tipos genéricos, como clases, estructuras y enumeraciones.
Ejemplo de Estructura Genérica
struct Stack<Element> {
var items = [Element]()
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
}Explicación del Código
struct Stack<Element>: Define una estructura genéricaStackque puede contener elementos de cualquier tipoElement.var items = [Element](): Un array de elementos de tipoElement.mutating func push(_ item: Element): Método para agregar un elemento al stack.mutating func pop() -> Element: Método para eliminar y devolver el último elemento del stack.
Uso de la Estructura Genérica
var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
print(stackOfStrings.pop()) // tresRestricciones de Tipo
Puedes restringir los tipos que se pueden usar con tus genéricos utilizando cláusulas where.
Ejemplo con Restricciones de Tipo
func findIndex<T: Equatable>(of valueToFind: T, in array: [T]) -> Int? {
for (index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}Explicación del Código
func findIndex<T: Equatable>(of valueToFind: T, in array: [T]) -> Int?: La funciónfindIndexsolo puede ser utilizada con tipos que conformen el protocoloEquatable.if value == valueToFind: Compara los valores utilizando el operador==, que está disponible porqueTconformaEquatable.
Uso de la Función con Restricciones de Tipo
let arrayOfStrings = ["apple", "banana", "cherry"]
if let index = findIndex(of: "banana", in: arrayOfStrings) {
print("El índice de banana es \(index)") // El índice de banana es 1
}Ejercicios Prácticos
Ejercicio 1: Función Genérica de Intercambio
Escribe una función genérica que intercambie dos valores de cualquier tipo.
Solución
Ejercicio 2: Pila Genérica
Crea una estructura genérica Queue que funcione como una cola (FIFO).
Solución
struct Queue<Element> {
private var elements = [Element]()
mutating func enqueue(_ element: Element) {
elements.append(element)
}
mutating func dequeue() -> Element? {
return elements.isEmpty ? nil : elements.removeFirst()
}
}Conclusión
En esta sección, has aprendido los conceptos básicos de los genéricos en Swift, cómo definir funciones y tipos genéricos, y cómo aplicar restricciones de tipo. Los genéricos son una herramienta poderosa que te permite escribir código más flexible y reutilizable. En el siguiente tema, exploraremos el manejo avanzado de errores en Swift.
Curso de Programación en Swift
Módulo 1: Introducción a Swift
- Introducción a Swift
- Configuración del Entorno de Desarrollo
- Tu Primer Programa en Swift
- Sintaxis y Estructura Básica
- Variables y Constantes
- Tipos de Datos
Módulo 2: Control de Flujo
Módulo 3: Funciones y Closures
- Definición y Llamada de Funciones
- Parámetros de Función y Valores de Retorno
- Closures
- Funciones de Orden Superior
Módulo 4: Programación Orientada a Objetos
Módulo 5: Swift Avanzado
Módulo 6: Swift y Desarrollo de iOS
- Introducción al Desarrollo de iOS
- Fundamentos de UIKit
- Storyboards y Interface Builder
- Redes en Swift
- Core Data
- Fundamentos de SwiftUI
