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