Estensioni Objective-C

Un'estensione di classe ha qualche somiglianza con una categoria, ma può essere aggiunta solo a una classe per la quale si dispone del codice sorgente in fase di compilazione (la classe viene compilata contemporaneamente all'estensione di classe).

I metodi dichiarati da un'estensione di classe sono implementati nel blocco di implementazione per la classe originale, quindi non è possibile, ad esempio, dichiarare un'estensione di classe su una classe framework, come una classe Cocoa o Cocoa Touch come NSString.

Le estensioni sono in realtà categorie senza il nome della categoria. Viene spesso indicato comeanonymous categories.

La sintassi per dichiarare un'estensione utilizza la parola chiave @interface, proprio come una descrizione di una classe Objective-C standard, ma non indica alcuna eredità da una sottoclasse. Invece, aggiunge solo parentesi, come mostrato di seguito:

@interface ClassName ()

@end

Caratteristiche delle estensioni

  • Un'estensione non può essere dichiarata per nessuna classe, solo per le classi di cui abbiamo l'implementazione originale del codice sorgente.

  • Un'estensione sta aggiungendo metodi privati ​​e variabili private che sono solo specifici per la classe.

  • Qualsiasi metodo o variabile dichiarata all'interno delle estensioni non è accessibile nemmeno alle classi ereditate.

Esempio di estensioni

Creiamo una classe SampleClass che abbia un'estensione. Nell'estensione, disponiamo di una variabile privata internalID.

Quindi, disponiamo di un metodo getExternalID che restituisca l'ID esterno dopo l'elaborazione dell'ID interno.

L'esempio è mostrato di seguito e questo non funzionerà con il compilatore online.

#import <Foundation/Foundation.h>

@interface SampleClass : NSObject {
   NSString *name;
}

- (void)setInternalID;
- (NSString *)getExternalID;

@end

@interface SampleClass() {
   NSString *internalID;
}

@end

@implementation SampleClass

- (void)setInternalID {
   internalID = [NSString stringWithFormat: 
   @"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}

- (NSString *)getExternalID {
   return [internalID stringByReplacingOccurrencesOfString: 
   @"UNIQUEINTERNALKEY" withString:@""];
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass setInternalID];
   NSLog(@"ExternalID: %@",[sampleClass getExternalID]);        
   [pool drain];
   return 0;
}

Ora, quando compiliamo ed eseguiamo il programma, otterremo il seguente risultato.

2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51

Nell'esempio sopra, possiamo vedere che l'ID interno non viene restituito direttamente. Rimuoviamo qui UNIQUEINTERNALKEY e rendiamo disponibile solo il valore rimanente al metodo getExternalID.

L'esempio precedente utilizza solo un'operazione su stringa, ma può avere molte funzionalità come crittografia / decrittografia e così via.