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

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

entrer la description de l'image ici

entrer la description de l'image ici

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]];


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow