En aquest tema, explorarem els protocols i delegats en Objective-C, conceptes fonamentals per a la programació orientada a objectes i la creació d'aplicacions modulars i flexibles. Els protocols defineixen un conjunt de mètodes que una classe pot implementar, mentre que els delegats permeten que una classe delegui responsabilitats a una altra classe.
- Introducció als Protocols
Què és un Protocol?
Un protocol en Objective-C és una llista de mètodes que una classe pot implementar. Els protocols són similars a les interfícies en altres llenguatges de programació com Java. Els protocols permeten definir un contracte que les classes poden seguir.
Definició d'un Protocol
Per definir un protocol, utilitzem la paraula clau @protocol
seguida del nom del protocol i la llista de mètodes.
Explicació del Codi
@protocol MyProtocol <NSObject>
: Defineix un nou protocol anomenatMyProtocol
que hereta del protocolNSObject
.- (void)requiredMethod;
: Defineix un mètode obligatori que qualsevol classe que implementi aquest protocol ha de definir.@optional
: Indica que els mètodes següents són opcionals.- (void)optionalMethod;
: Defineix un mètode opcional.
Implementació d'un Protocol
Una classe implementa un protocol afegint el nom del protocol entre angle brackets (< >
) després del nom de la classe.
@interface MyClass : NSObject <MyProtocol> @end @implementation MyClass - (void)requiredMethod { // Implementació del mètode obligatori } - (void)optionalMethod { // Implementació del mètode opcional } @end
- Introducció als Delegats
Què és un Delegat?
Un delegat és un objecte que actua en nom d'un altre objecte per gestionar certs esdeveniments o accions. Els delegats són una manera de passar responsabilitats d'una classe a una altra, permetent una major modularitat i reutilització del codi.
Patró Delegat
El patró delegat implica dos objectes: el delegador i el delegat. El delegador és l'objecte que delega tasques, mentre que el delegat és l'objecte que realitza aquestes tasques.
Definició d'un Delegat
Per definir un delegat, primer definim un protocol que conté els mètodes que el delegat ha d'implementar.
Utilització d'un Delegat
La classe delegadora tindrà una propietat per al delegat i cridarà els mètodes del delegat quan sigui necessari.
@interface MyDelegator : NSObject @property (nonatomic, weak) id<MyDelegate> delegate; - (void)performTask; @end @implementation MyDelegator - (void)performTask { // Realitza alguna tasca // ... // Notifica al delegat que la tasca ha finalitzat [self.delegate taskDidComplete]; } @end
Implementació del Delegat
Una altra classe implementarà el protocol del delegat i es registrarà com a delegat de la classe delegadora.
@interface MyDelegateClass : NSObject <MyDelegate> @end @implementation MyDelegateClass - (void)taskDidComplete { NSLog(@"La tasca ha finalitzat."); } @end // Utilització del delegat MyDelegator *delegator = [[MyDelegator alloc] init]; MyDelegateClass *delegateClass = [[MyDelegateClass alloc] init]; delegator.delegate = delegateClass; [delegator performTask];
- Exercicis Pràctics
Exercici 1: Crear un Protocol i Implementar-lo
- Defineix un protocol anomenat
DataSource
amb un mètode obligatori- (NSInteger)numberOfItems
. - Crea una classe
DataProvider
que implementi aquest protocol. - Implementa el mètode
numberOfItems
aDataProvider
per retornar un nombre fix d'elements.
Solució
@protocol DataSource <NSObject> - (NSInteger)numberOfItems; @end @interface DataProvider : NSObject <DataSource> @end @implementation DataProvider - (NSInteger)numberOfItems { return 42; } @end
Exercici 2: Utilitzar un Delegat
- Defineix un protocol
TaskDelegate
amb un mètode- (void)taskDidFinish
. - Crea una classe
TaskManager
que tingui una propietat delegada i un mètode- (void)startTask
. - Implementa el mètode
startTask
per cridar al mètode del delegat quan la tasca finalitzi. - Crea una classe
TaskHandler
que implementi el protocolTaskDelegate
i imprimeixi un missatge quan la tasca finalitzi.
Solució
@protocol TaskDelegate <NSObject> - (void)taskDidFinish; @end @interface TaskManager : NSObject @property (nonatomic, weak) id<TaskDelegate> delegate; - (void)startTask; @end @implementation TaskManager - (void)startTask { // Simula una tasca // ... // Notifica al delegat que la tasca ha finalitzat [self.delegate taskDidFinish]; } @end @interface TaskHandler : NSObject <TaskDelegate> @end @implementation TaskHandler - (void)taskDidFinish { NSLog(@"La tasca ha finalitzat."); } @end // Utilització del delegat TaskManager *taskManager = [[TaskManager alloc] init]; TaskHandler *taskHandler = [[TaskHandler alloc] init]; taskManager.delegate = taskHandler; [taskManager startTask];
- Resum
En aquest tema, hem après sobre els protocols i delegats en Objective-C. Els protocols defineixen un conjunt de mètodes que una classe pot implementar, mentre que els delegats permeten que una classe delegui responsabilitats a una altra classe. Hem vist com definir i implementar protocols, així com com utilitzar delegats per modularitzar i reutilitzar el codi. Aquests conceptes són fonamentals per a la programació orientada a objectes i la creació d'aplicacions flexibles i escalables.
Curs de Programació en Objective-C
Mòdul 1: Introducció a Objective-C
- Introducció a Objective-C
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Tipus de Dades i Variables
- Operadors i Expressions
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Mètodes
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Sintaxi de Mètodes en Objective-C
- Mètodes de Classe i d'Instància
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Gestió de Memòria
- Introducció a la Gestió de Memòria
- Comptatge Automàtic de Referències (ARC)
- Retenció i Alliberament Manual
- Millors Pràctiques de Gestió de Memòria
Mòdul 6: Temes Avançats
Mòdul 7: Treballant amb Dades
- Gestió d'Arxius
- Serialització i Deserialització
- Conceptes Bàsics de Xarxes
- Treballant amb JSON i XML
Mòdul 8: Desenvolupament d'Interfícies d'Usuari
- Introducció a UIKit
- Vistes i Controladors de Vista
- Disseny Automàtic
- Gestió de l'Entrada de l'Usuari