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
}
@endExemple 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
}
@endExemple 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ó
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];
}
@endExercici 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");
}
}
@endConclusió
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.
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
