Extensions Objective-C
Une extension de classe présente une certaine similitude avec une catégorie, mais elle ne peut être ajoutée qu'à une classe pour laquelle vous avez le code source au moment de la compilation (la classe est compilée en même temps que l'extension de classe).
Les méthodes déclarées par une extension de classe sont implémentées dans le bloc d'implémentation de la classe d'origine, vous ne pouvez donc pas, par exemple, déclarer une extension de classe sur une classe de framework, telle qu'une classe Cocoa ou Cocoa Touch comme NSString.
Les extensions sont en fait des catégories sans nom de catégorie. Il est souvent appeléanonymous categories.
La syntaxe pour déclarer une extension utilise le mot-clé @interface, tout comme une description de classe Objective-C standard, mais n'indique aucun héritage d'une sous-classe. Au lieu de cela, il ajoute simplement des parenthèses, comme indiqué ci-dessous -
@interface ClassName ()
@end
Caractéristiques des extensions
Une extension ne peut être déclarée pour aucune classe, uniquement pour les classes pour lesquelles nous avons l'implémentation d'origine du code source.
Une extension ajoute des méthodes privées et des variables privées qui ne sont spécifiques qu'à la classe.
Toute méthode ou variable déclarée dans les extensions n'est pas accessible même aux classes héritées.
Exemple d'extensions
Créons une classe SampleClass qui a une extension. Dans l'extension, nous allons avoir une variable privée internalID.
Ensuite, nous allons avoir une méthode getExternalID qui renvoie le externalID après avoir traité le internalID.
L'exemple est illustré ci-dessous et cela ne fonctionnera pas sur le compilateur en ligne.
#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;
}
Maintenant, lorsque nous compilons et exécutons le programme, nous obtiendrons le résultat suivant.
2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51
Dans l'exemple ci-dessus, nous pouvons voir que le internalID n'est pas retourné directement. Nous supprimons ici UNIQUEINTERNALKEY et ne rendons disponible que la valeur restante à la méthode getExternalID.
L'exemple ci-dessus utilise simplement une opération de chaîne, mais il peut avoir de nombreuses fonctionnalités telles que le cryptage / décryptage, etc.