Objective-C Language
kategorier
Sök…
Syntax
@interface ClassName (kategorinamn) // ClassName är den klass som ska utökas
// Metod- och egendomsdeklarationer
@slutet
Anmärkningar
För att undvika xyz_
i xyz_
rekommenderas det att använda prefix (som xyz_
i exemplet). Om det finns metoder med samma namn, definieras det inte vilket som ska användas under körtiden.
Enkel kategori
Gränssnitt och implementering av en enkel kategori på NSArray, med namnet Filter, med en enda metod som filtrerar siffror.
Det är bra att lägga till ett prefix ( PF
) till metoden för att säkerställa att vi inte skriver över några framtida NSArray
metoder.
@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
Förklarar en klassmetod
UIColor+XYZPalette.h
:
@interface UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor;
@end
och implementering 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
Lägga till en fastighet med en kategori
Egenskaper kan läggas till med kategorier med tillhörande objekt, en funktion i Objekt-C-runtime.
Observera att fastighetsdeklarationen för retain, nonatomic
matchar det sista argumentet till objc_setAssociatedObject
. Se Bifoga objekt till ett annat befintligt objekt för förklaringar.
#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
I enlighet med protokoll
Du kan lägga till protokoll till standardklasser för att utöka deras funktionalitet:
@protocol EncodableToString <NSObject>
- (NSString *)toString;
@end
@interface NSDictionary (XYZExtended) <EncodableToString>
@end
@implementation NSDictionary (XYZExtended)
- (NSString *)toString {
return self.description;
}
@end
där XYZ
ditt projekt prefix
Skapa en kategori på XCode
Kategorier ger möjlighet att lägga till lite extra funktionalitet till ett objekt utan att underklassificera eller ändra det faktiska objektet.
Vi vill till exempel ställa in några anpassade teckensnitt. Låt oss skapa en kategori som lägger till funktionalitet i UIFont
klassen. Öppna ditt XCode-projekt, klicka på File
-> New
-> File
och välj Objective-C file
, klicka på Nästa ange ditt kategorin namn säga "CustomFont" välj filtyp som kategori och klass som UIFont och klicka sedan på "Nästa" följt av "Skapa. "
Förklara kategorimetoden: -
Klicka på "UIFont + CustomFonts.h" för att se rubrikfilen för den nya kategorin. Lägg till följande kod i gränssnittet för att deklarera metoden.
@interface UIFont (CustomFonts)
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size;
@end
Implementera nu kategorimetoden: -
Klicka på "UIFont + CustomFonts.m" för att se kategorins implementeringsfil. Lägg till följande kod för att skapa en metod som ställer in ProductSansRegular Font.
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size{
return [UIFont fontWithName:@"ProductSans-Regular" size:size];
}
Importera din kategori
#import "UIFont+CustomFonts.h"
Ställ nu Label-typsnittet
[self.label setFont:[UIFont productSansRegularFontWithSize:16.0]];