Objective-C Language
Catégories
Recherche…
Syntaxe
@interface ClassName (categoryName) // ClassName est la classe à étendre
// Déclarations de méthode et de propriété
@fin
Remarques
Pour éviter les conflits de noms de méthodes, il est recommandé d'utiliser des préfixes (comme xyz_
dans l'exemple). Si des méthodes portant le même nom existent, il est impossible de définir celle qui sera utilisée dans le runtime.
Catégorie simple
Interface et implémentation d'une catégorie simple sur NSArray, nommée Filter, avec une méthode unique qui filtre les nombres.
Il est recommandé d'ajouter un préfixe ( PF
) à la méthode pour éviter de remplacer les futures méthodes NSArray
.
@interface NSArray (PFFilter)
- (NSArray *)pf_filterSmaller:(double)number;
@end
@implementation NSArray (PFFilter)
- (NSArray *)pf_filterSmaller:(double)number
{
NSMutableArray *result = [NSMutableArray array];
for (id val in self)
{
if ([val isKindOfClass:[NSNumber class] && [val doubleValue] >= number)
{
[result addObject:val];
}
}
return [result copy];
}
@end
Déclaration d'une méthode de classe
Fichier d'en-tête UIColor+XYZPalette.h
:
@interface UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor;
@end
et implémentation UIColor+XYZPalette.m
:
@implementation UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor
{
return [UIColor colorWithRed:75/255.0f green:0/255.0f blue:130/255.0f alpha:1.0f];
}
@end
Ajout d'une propriété avec une catégorie
Des propriétés peuvent être ajoutées avec des catégories en utilisant des objets associés, une fonctionnalité du runtime Objective-C.
Notez que la déclaration de propriété de retain, nonatomic
correspond au dernier argument de objc_setAssociatedObject
. Voir Joindre un objet à un autre objet existant pour obtenir des explications.
#import <objc/runtime.h>
@interface UIViewController (ScreenName)
@property (retain, nonatomic) NSString *screenName;
@end
@implementation UIViewController (ScreenName)
@dynamic screenName;
- (NSString *)screenName {
return objc_getAssociatedObject(self, @selector(screenName));
}
- (void)setScreenName:(NSString *)screenName {
objc_setAssociatedObject(self, @selector(screenName), screenName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
Conforme au protocole
Vous pouvez ajouter des protocoles aux classes standard pour étendre leurs fonctionnalités:
@protocol EncodableToString <NSObject>
- (NSString *)toString;
@end
@interface NSDictionary (XYZExtended) <EncodableToString>
@end
@implementation NSDictionary (XYZExtended)
- (NSString *)toString {
return self.description;
}
@end
où XYZ
préfixe de votre projet
Créer une catégorie sur XCode
Les catégories permettent d'ajouter des fonctionnalités supplémentaires à un objet sans sous-classer ni modifier l'objet réel.
Par exemple, nous voulons définir des polices personnalisées. Créons une catégorie qui ajoute des fonctionnalités à la classe UIFont
. Ouvrez votre projet XCode, cliquez sur File
-> New
-> File
et choisissez le Objective-C file
, cliquez sur Suivant. Entrez le nom de votre catégorie, puis "CustomFont". "
Déclarez la méthode de la catégorie: -
Cliquez sur "UIFont + CustomFonts.h" pour afficher le fichier d'en-tête de la nouvelle catégorie. Ajoutez le code suivant à l'interface pour déclarer la méthode.
@interface UIFont (CustomFonts)
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size;
@end
Maintenant, implémentez la méthode de la catégorie: -
Cliquez sur "UIFont + CustomFonts.m" pour afficher le fichier d'implémentation de la catégorie. Ajoutez le code suivant pour créer une méthode définissant la police ProductSansRegular.
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size{
return [UIFont fontWithName:@"ProductSans-Regular" size:size];
}
Importez votre catégorie
#import "UIFont+CustomFonts.h"
Maintenant, définissez la police d'étiquette
[self.label setFont:[UIFont productSansRegularFontWithSize:16.0]];