Els genèrics són una característica poderosa de Swift que permet escriure funcions, classes i altres tipus que poden treballar amb qualsevol tipus, subjecte a certes restriccions. Això permet crear codi més flexible i reutilitzable.

Conceptes Clau

  1. Definició de Genèrics: Els genèrics permeten definir funcions i tipus que poden treballar amb qualsevol tipus de dades.
  2. Paràmetres de Tipus: Els genèrics utilitzen paràmetres de tipus per especificar el tipus de dades amb què treballaran.
  3. Restriccions de Tipus: Es poden imposar restriccions als paràmetres de tipus per assegurar-se que compleixin certs requisits.

Definició de Funcions Genèriques

Una funció genèrica pot treballar amb qualsevol tipus de dades. Aquí teniu un exemple d'una funció genèrica que intercanvia els valors de dues variables:

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

Explicació del Codi

  • func intercanviar<T>(_ a: inout T, _ b: inout T): La funció intercanviar té un paràmetre de tipus T.
  • inout: Indica que els paràmetres a i b es passen per referència, permetent que la funció modifiqui els valors originals.
  • let temporal = a: Emmagatzema el valor de a en una variable temporal.
  • a = b: Assigna el valor de b a a.
  • b = temporal: Assigna el valor temporal (original de a) a b.

Exemple d'Ús

var primer = 5
var segon = 10
intercanviar(&primer, &segon)
print("Primer: \(primer), Segon: \(segon)") // Primer: 10, Segon: 5

Classes i Estructures Genèriques

També es poden crear classes i estructures genèriques. Aquí teniu un exemple d'una estructura genèrica Caixa que pot contenir qualsevol tipus de dades:

struct Caixa<T> {
    var valor: T
}

let caixaEnter = Caixa(valor: 5)
let caixaText = Caixa(valor: "Hola")

Explicació del Codi

  • struct Caixa<T>: Defineix una estructura genèrica Caixa amb un paràmetre de tipus T.
  • var valor: T: Declara una propietat valor de tipus T.

Restriccions de Tipus

Es poden imposar restriccions als paràmetres de tipus per assegurar-se que compleixin certs requisits. Per exemple, es pot requerir que un tipus implementi un protocol específic:

func comparar<T: Comparable>(_ a: T, _ b: T) -> Bool {
    return a == b
}

Explicació del Codi

  • func comparar<T: Comparable>(_ a: T, _ b: T) -> Bool: La funció comparar té un paràmetre de tipus T que ha de complir el protocol Comparable.
  • return a == b: Compara els valors a i b utilitzant l'operador ==.

Exercicis Pràctics

Exercici 1: Funció Genèrica de Cerca

Escriu una funció genèrica cerca que busqui un element en una matriu i retorni el seu índex si es troba, o nil si no es troba.

func cerca<T: Equatable>(_ element: T, en array: [T]) -> Int? {
    for (index, item) in array.enumerated() {
        if item == element {
            return index
        }
    }
    return nil
}

Solució

let nombres = [1, 2, 3, 4, 5]
if let index = cerca(3, en: nombres) {
    print("Element trobat a l'índex \(index)")
} else {
    print("Element no trobat")
}

Exercici 2: Pila Genèrica

Crea una estructura genèrica Pila que implementi les operacions bàsiques d'una pila (push, pop, peek).

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

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

    mutating func pop() -> T? {
        return elements.popLast()
    }

    func peek() -> T? {
        return elements.last
    }

    var isEmpty: Bool {
        return elements.isEmpty
    }
}

Solució

var pilaEnter = Pila<Int>()
pilaEnter.push(1)
pilaEnter.push(2)
pilaEnter.push(3)
print(pilaEnter.pop() ?? "Pila buida") // 3
print(pilaEnter.peek() ?? "Pila buida") // 2
print(pilaEnter.isEmpty) // false

Resum

En aquesta secció, hem après sobre els genèrics en Swift, incloent-hi com definir funcions, classes i estructures genèriques, així com com imposar restriccions de tipus. Els genèrics són una eina poderosa per crear codi flexible i reutilitzable. Hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. En la següent secció, explorarem la gestió d'errors avançada en Swift.

© Copyright 2024. Tots els drets reservats