Objective-C Language
Categorieën
Zoeken…
Syntaxis
@interface ClassName (categoryName) // ClassName is de klasse die moet worden uitgebreid
// Methode- en eigenschapsverklaringen
@einde
Opmerkingen
Om conflicten tussen methodenamen te voorkomen, wordt het aanbevolen om voorvoegsels te gebruiken (zoals xyz_
in het voorbeeld). Als er methoden met dezelfde naam bestaan, is niet gedefinieerd welke methode in de runtime zal worden gebruikt.
Eenvoudige categorie
Interface en implementatie van een eenvoudige categorie op NSArray, genaamd Filter, met een enkele methode die getallen filtert.
Het is een goede gewoonte om een voorvoegsel ( PF
) aan de methode toe te voegen om ervoor te zorgen dat we geen toekomstige NSArray
methoden overschrijven.
@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
Een klassemethode verklaren
Koptekstbestand UIColor+XYZPalette.h
:
@interface UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor;
@end
en implementatie 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
Een eigenschap toevoegen met een categorie
Eigenschappen kunnen worden toegevoegd aan categorieën met behulp van bijbehorende objecten, een kenmerk van de Objective-C runtime.
Merk op dat de eigenschapsverklaring van retain, nonatomic
overeenkomt met het laatste argument met objc_setAssociatedObject
. Zie Object koppelen aan een ander bestaand object voor uitleg.
#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
Conform protocol
U kunt protocollen toevoegen aan standaardklassen om hun functionaliteit uit te breiden:
@protocol EncodableToString <NSObject>
- (NSString *)toString;
@end
@interface NSDictionary (XYZExtended) <EncodableToString>
@end
@implementation NSDictionary (XYZExtended)
- (NSString *)toString {
return self.description;
}
@end
waar XYZ
het voorvoegsel van uw project
Maak een categorie op XCode
Categorieën bieden de mogelijkheid om wat extra functionaliteit aan een object toe te voegen zonder subklasse of het feitelijke object te wijzigen.
We willen bijvoorbeeld enkele aangepaste lettertypen instellen. Laten we een categorie maken die functionaliteit toevoegt aan de UIFont
klasse. Open uw XCode-project, klik op File
-> New
-> File
en kies Objective-C file
, klik op Volgende voer uw categorienaam in en zeg "CustomFont" kies het bestandstype als Categorie en Klasse als UIFont en klik vervolgens op "Volgende" gevolgd door "Maken. "
Verklaar de categoriemethode: -
Klik op "UIFont + CustomFonts.h" om het headerbestand van de nieuwe categorie te bekijken. Voeg de volgende code toe aan de interface om de methode te declareren.
@interface UIFont (CustomFonts)
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size;
@end
Implementeer nu de categoriemethode: -
Klik op "UIFont + CustomFonts.m" om het implementatiebestand van de categorie te bekijken. Voeg de volgende code toe om een methode te maken waarmee ProductSansRegular Font wordt ingesteld.
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size{
return [UIFont fontWithName:@"ProductSans-Regular" size:size];
}
Importeer uw categorie
#import "UIFont+CustomFonts.h"
Stel nu het lettertype Label in
[self.label setFont:[UIFont productSansRegularFontWithSize:16.0]];