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.

  1. 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.

@protocol MyProtocol <NSObject>
- (void)requiredMethod;
@optional
- (void)optionalMethod;
@end

Explicació del Codi

  • @protocol MyProtocol <NSObject>: Defineix un nou protocol anomenat MyProtocol que hereta del protocol NSObject.
  • - (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

  1. 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.

@protocol MyDelegate <NSObject>
- (void)taskDidComplete;
@end

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];

  1. Exercicis Pràctics

Exercici 1: Crear un Protocol i Implementar-lo

  1. Defineix un protocol anomenat DataSource amb un mètode obligatori - (NSInteger)numberOfItems.
  2. Crea una classe DataProvider que implementi aquest protocol.
  3. Implementa el mètode numberOfItems a DataProvider 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

  1. Defineix un protocol TaskDelegate amb un mètode - (void)taskDidFinish.
  2. Crea una classe TaskManager que tingui una propietat delegada i un mètode - (void)startTask.
  3. Implementa el mètode startTask per cridar al mètode del delegat quan la tasca finalitzi.
  4. Crea una classe TaskHandler que implementi el protocol TaskDelegate 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];

  1. 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.

© Copyright 2024. Tots els drets reservats