En aquest tema, explorarem les categories i extensions en Objective-C, dues eines poderoses que permeten afegir funcionalitat a les classes existents sense necessitat de modificar el seu codi original. Aquestes tècniques són especialment útils per a la modularitat i la reutilització del codi.

Categories

Què són les Categories?

Les categories en Objective-C permeten afegir mètodes a una classe existent sense la necessitat de crear una subclasse. Això és útil per estendre la funcionalitat de les classes de les quals no tenim el codi font o per organitzar el codi en mòduls més manejables.

Sintaxi de les Categories

Per definir una categoria, utilitzem la següent sintaxi:

// Fitxer .h
@interface ClassName (CategoryName)
- (void)newMethod;
@end

// Fitxer .m
@implementation ClassName (CategoryName)
- (void)newMethod {
    // Implementació del mètode
}
@end

Exemple Pràctic

Suposem que volem afegir un mètode a la classe NSString per invertir una cadena de text:

// NSString+Reverse.h
#import <Foundation/Foundation.h>

@interface NSString (Reverse)
- (NSString *)reverseString;
@end

// NSString+Reverse.m
#import "NSString+Reverse.h"

@implementation NSString (Reverse)
- (NSString *)reverseString {
    NSUInteger length = [self length];
    NSMutableString *reversedString = [NSMutableString stringWithCapacity:length];
    
    for (NSInteger i = length - 1; i >= 0; i--) {
        [reversedString appendFormat:@"%C", [self characterAtIndex:i]];
    }
    
    return reversedString;
}
@end

Ús de la Categoria

#import "NSString+Reverse.h"

NSString *originalString = @"Hello, World!";
NSString *reversedString = [originalString reverseString];
NSLog(@"Original: %@, Reversed: %@", originalString, reversedString);

Extensions

Què són les Extensions?

Les extensions són una forma especial de categories que permeten afegir mètodes privats i propietats a una classe. A diferència de les categories, les extensions es declaren dins del fitxer d'implementació (.m) i no es poden utilitzar per afegir mètodes públics.

Sintaxi de les Extensions

Per definir una extensió, utilitzem la següent sintaxi:

// Fitxer .m
@interface ClassName ()
- (void)privateMethod;
@property (nonatomic, strong) id privateProperty;
@end

@implementation ClassName
- (void)privateMethod {
    // Implementació del mètode
}
@end

Exemple Pràctic

Suposem que tenim una classe Person i volem afegir una propietat privada age i un mètode privat calculateAge:

// Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
- (void)printDetails;
@end

// Person.m
#import "Person.h"

@interface Person ()
@property (nonatomic, assign) NSInteger age;
- (void)calculateAge;
@end

@implementation Person

- (void)calculateAge {
    // Càlcul de l'edat (exemple fictici)
    self.age = 30;
}

- (void)printDetails {
    [self calculateAge];
    NSLog(@"Name: %@, Age: %ld", self.name, (long)self.age);
}

@end

Ús de l'Extensió

Person *person = [[Person alloc] init];
person.name = @"John Doe";
[person printDetails];

Exercicis Pràctics

Exercici 1: Afegir una Categoria

Crea una categoria per la classe NSArray que afegeixi un mètode per obtenir l'element del mig de l'array.

Solució

// NSArray+MiddleElement.h
#import <Foundation/Foundation.h>

@interface NSArray (MiddleElement)
- (id)middleElement;
@end

// NSArray+MiddleElement.m
#import "NSArray+MiddleElement.h"

@implementation NSArray (MiddleElement)
- (id)middleElement {
    if ([self count] == 0) return nil;
    return [self objectAtIndex:[self count] / 2];
}
@end

Exercici 2: Afegir una Extensió

Afegeix una extensió a la classe Car que afegeixi una propietat privada engineStatus i un mètode privat startEngine.

Solució

// Car.h
#import <Foundation/Foundation.h>

@interface Car : NSObject
@property (nonatomic, strong) NSString *model;
- (void)drive;
@end

// Car.m
#import "Car.h"

@interface Car ()
@property (nonatomic, assign) BOOL engineStatus;
- (void)startEngine;
@end

@implementation Car

- (void)startEngine {
    self.engineStatus = YES;
    NSLog(@"Engine started");
}

- (void)drive {
    [self startEngine];
    if (self.engineStatus) {
        NSLog(@"Driving the car");
    }
}

@end

Conclusió

Les categories i extensions són eines poderoses en Objective-C que permeten afegir funcionalitat a les classes existents de manera modular i organitzada. Les categories són útils per afegir mètodes públics, mentre que les extensions són ideals per afegir mètodes i propietats privades. Amb aquests coneixements, podràs escriure codi més net i mantenible.

En el següent tema, explorarem els blocs i clausures, una altra característica avançada d'Objective-C que permet escriure codi més concís i expressiu.

© Copyright 2024. Tots els drets reservats