Objective-C Language
categorie
Ricerca…
Sintassi
@interface ClassName (categoryName) // ClassName è la classe da estendere
// Metodo e dichiarazioni di proprietà
@fine
Osservazioni
Per evitare conflitti con il nome del metodo, si consiglia di usare prefissi (come xyz_
nell'esempio). Se esistono metodi con lo stesso nome, non è definito quale sarà utilizzato nel runtime.
Categoria semplice
Interfaccia e implementazione di una categoria semplice su NSArray, denominato Filter, con un unico metodo che filtra i numeri.
È buona pratica aggiungere un prefisso ( PF
) al metodo per garantire che non sovrascriveremo alcun metodo NSArray
futuro.
@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
Dichiarazione di un metodo di classe
File di intestazione UIColor+XYZPalette.h
:
@interface UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor;
@end
e implementazione 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
Aggiunta di una proprietà con una categoria
Le proprietà possono essere aggiunte con le categorie usando oggetti associati, una caratteristica del runtime Objective-C.
Si noti che la dichiarazione di proprietà di retain, nonatomic
corrisponde all'ultimo argomento a objc_setAssociatedObject
. Vedi Collega oggetto ad un altro oggetto esistente per spiegazioni.
#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 al protocollo
È possibile aggiungere protocolli a classi standard per estenderne le funzionalità:
@protocol EncodableToString <NSObject>
- (NSString *)toString;
@end
@interface NSDictionary (XYZExtended) <EncodableToString>
@end
@implementation NSDictionary (XYZExtended)
- (NSString *)toString {
return self.description;
}
@end
dove XYZ
è il prefisso del tuo progetto
Crea una categoria su XCode
Le categorie offrono la possibilità di aggiungere alcune funzionalità extra a un oggetto senza creare sottoclassi o modificare l'oggetto reale.
Ad esempio vogliamo impostare alcuni caratteri personalizzati. Creiamo una categoria che aggiunge funzionalità alla classe UIFont
. Apri il tuo progetto XCode, fai clic su File
-> New
-> File
e scegli il File
Objective-C file
, fai clic su Avanti inserisci il nome della tua categoria dì "CustomFont" scegli il tipo di file come Categoria e Classe come UIFont, quindi fai clic su "Avanti" seguito da "Crea". "
Dichiarare il metodo di categoria: -
Fai clic su "UIFont + CustomFonts.h" per visualizzare il file di intestazione della nuova categoria. Aggiungere il seguente codice all'interfaccia per dichiarare il metodo.
@interface UIFont (CustomFonts)
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size;
@end
Ora implementare il metodo di categoria: -
Fai clic su "UIFont + CustomFonts.m" per visualizzare il file di implementazione della categoria. Aggiungere il seguente codice per creare un metodo che imposterà il carattere ProductSansRegular.
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size{
return [UIFont fontWithName:@"ProductSans-Regular" size:size];
}
Importa la tua categoria
#import "UIFont+CustomFonts.h"
Ora imposta il font Label
[self.label setFont:[UIFont productSansRegularFontWithSize:16.0]];