Introducció

Les extensions en Swift permeten afegir noves funcionalitats a una classe, estructura, enumeració o protocol existent. Aquesta característica és molt poderosa perquè permet millorar el codi existent sense necessitat de modificar-lo directament. Les extensions poden afegir mètodes, propietats computades, inicialitzadors, subíndexs, tipus interns i conformitat a protocols.

Conceptes Clau

Què poden fer les extensions?

  1. Afegir mètodes i propietats computades: Les extensions poden afegir nous mètodes i propietats computades a tipus existents.
  2. Afegir inicialitzadors: Les extensions poden afegir nous inicialitzadors a tipus existents.
  3. Afegir subíndexs: Les extensions poden afegir subíndexs a tipus existents.
  4. Afegir conformitat a protocols: Les extensions poden fer que un tipus existent conformi a un protocol, afegint les implementacions necessàries.

Què no poden fer les extensions?

  1. Afegir propietats emmagatzemades: Les extensions no poden afegir noves propietats emmagatzemades a un tipus existent.
  2. Afegir inicialitzadors deconvenients: Les extensions no poden afegir inicialitzadors deconvenients a classes que no tenen inicialitzadors designats.

Sintaxi Bàsica

La sintaxi per crear una extensió és molt senzilla. Aquí tens un exemple bàsic:

extension NomDelTipus {
    // Afegeix funcionalitats aquí
}

Exemples Pràctics

Afegir Mètodes

Suposem que tenim una estructura Rectangle i volem afegir un mètode per calcular l'àrea:

struct Rectangle {
    var width: Double
    var height: Double
}

extension Rectangle {
    func area() -> Double {
        return width * height
    }
}

let rect = Rectangle(width: 10, height: 5)
print("L'àrea del rectangle és \(rect.area())") // L'àrea del rectangle és 50.0

Afegir Propietats Computades

Podem afegir una propietat computada a la mateixa estructura Rectangle per obtenir el perímetre:

extension Rectangle {
    var perimeter: Double {
        return 2 * (width + height)
    }
}

print("El perímetre del rectangle és \(rect.perimeter)") // El perímetre del rectangle és 30.0

Afegir Inicialitzadors

Podem afegir un inicialitzador a una estructura existent:

extension Rectangle {
    init(side: Double) {
        self.width = side
        self.height = side
    }
}

let square = Rectangle(side: 5)
print("L'àrea del quadrat és \(square.area())") // L'àrea del quadrat és 25.0

Afegir Conformitat a Protocols

Suposem que tenim un protocol Descriptible i volem que Rectangle el conformi:

protocol Descriptible {
    func description() -> String
}

extension Rectangle: Descriptible {
    func description() -> String {
        return "Rectangle amb amplada \(width) i alçada \(height)"
    }
}

print(rect.description()) // Rectangle amb amplada 10.0 i alçada 5.0

Exercicis Pràctics

Exercici 1: Afegir Mètodes a una Estructura

  1. Crea una estructura Circle amb una propietat radius de tipus Double.
  2. Afegeix una extensió a Circle que inclogui un mètode area per calcular l'àrea del cercle.
  3. Afegeix una propietat computada circumference per calcular la circumferència del cercle.

Solució

struct Circle {
    var radius: Double
}

extension Circle {
    func area() -> Double {
        return .pi * radius * radius
    }
    
    var circumference: Double {
        return 2 * .pi * radius
    }
}

let circle = Circle(radius: 3)
print("L'àrea del cercle és \(circle.area())") // L'àrea del cercle és 28.274333882308138
print("La circumferència del cercle és \(circle.circumference)") // La circumferència del cercle és 18.84955592153876

Exercici 2: Afegir Conformitat a un Protocol

  1. Defineix un protocol Identifiable amb una propietat id de tipus String.
  2. Crea una classe Person amb propietats name i age.
  3. Afegeix una extensió a Person per conformar al protocol Identifiable.

Solució

protocol Identifiable {
    var id: String { get }
}

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

extension Person: Identifiable {
    var id: String {
        return "\(name)-\(age)"
    }
}

let person = Person(name: "Joan", age: 30)
print("L'ID de la persona és \(person.id)") // L'ID de la persona és Joan-30

Conclusió

Les extensions són una eina poderosa en Swift que permeten afegir funcionalitats a tipus existents de manera modular i organitzada. Amb les extensions, pots millorar el teu codi sense necessitat de modificar-lo directament, mantenint així una estructura neta i fàcil de mantenir. Practica amb els exemples i exercicis proporcionats per dominar l'ús de les extensions en Swift.

© Copyright 2024. Tots els drets reservats