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
- Definició de Genèrics: Els genèrics permeten definir funcions i tipus que poden treballar amb qualsevol tipus de dades.
- Paràmetres de Tipus: Els genèrics utilitzen paràmetres de tipus per especificar el tipus de dades amb què treballaran.
- 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:
Explicació del Codi
func intercanviar<T>(_ a: inout T, _ b: inout T)
: La funcióintercanviar
té un paràmetre de tipusT
.inout
: Indica que els paràmetresa
ib
es passen per referència, permetent que la funció modifiqui els valors originals.let temporal = a
: Emmagatzema el valor dea
en una variable temporal.a = b
: Assigna el valor deb
aa
.b = temporal
: Assigna el valor temporal (original dea
) ab
.
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èricaCaixa
amb un paràmetre de tipusT
.var valor: T
: Declara una propietatvalor
de tipusT
.
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:
Explicació del Codi
func comparar<T: Comparable>(_ a: T, _ b: T) -> Bool
: La funciócomparar
té un paràmetre de tipusT
que ha de complir el protocolComparable
.return a == b
: Compara els valorsa
ib
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.
Curs de Programació en Swift
Mòdul 1: Introducció a Swift
- Introducció a Swift
- Configuració de l'Entorn de Desenvolupament
- El Teu Primer Programa en Swift
- Sintaxi i Estructura Bàsica
- Variables i Constants
- Tipus de Dades
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Closures
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Closures
- Funcions d'Ordre Superior
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Swift Avançat
Mòdul 6: Swift i Desenvolupament iOS
- Introducció al Desenvolupament iOS
- Conceptes Bàsics de UIKit
- Storyboards i Interface Builder
- Xarxes en Swift
- Core Data
- Conceptes Bàsics de SwiftUI