Objective-C Language
Categorías
Buscar..
Sintaxis
@interface ClassName (categoryName) // ClassName es la clase que se extenderá
// Declaraciones de método y propiedad
@fin
Observaciones
Para evitar choques de nombres de métodos, se recomienda usar prefijos (como xyz_
en el ejemplo). Si existen métodos con el mismo nombre, no está definido cuál se usará en el tiempo de ejecución.
Categoría simple
Interfaz e implementación de una categoría simple en NSArray, llamada Filter, con un solo método que filtra los números.
Es una buena práctica agregar un prefijo ( PF
) al método para garantizar que no sobrescribamos ningún método futuro de 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
Declarar un método de clase
Archivo de encabezado UIColor+XYZPalette.h
:
@interface UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor;
@end
y la implementación de 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
Añadiendo una propiedad con una categoría
Las propiedades se pueden agregar con categorías usando objetos asociados, una característica del tiempo de ejecución de Objective-C.
Tenga en cuenta que la declaración de propiedad de retain, nonatomic
coincide con el último argumento con objc_setAssociatedObject
. Consulte Adjuntar objeto a otro objeto existente para obtener explicaciones.
#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
De conformidad con el protocolo.
Puede agregar protocolos a las clases estándar para ampliar su funcionalidad:
@protocol EncodableToString <NSObject>
- (NSString *)toString;
@end
@interface NSDictionary (XYZExtended) <EncodableToString>
@end
@implementation NSDictionary (XYZExtended)
- (NSString *)toString {
return self.description;
}
@end
donde XYZ
prefijo tu proyecto
Crear una categoría en XCode
Las categorías proporcionan la capacidad de agregar alguna funcionalidad adicional a un objeto sin subclasificar o cambiar el objeto real.
Por ejemplo, queremos establecer algunas fuentes personalizadas. Vamos a crear una categoría que agregue funcionalidad a la clase UIFont
. Abra su proyecto XCode, haga clic en File
-> New
-> File
y elija File
Objective-C file
, haga clic en Siguiente, ingrese el nombre de su categoría, diga "CustomFont" elija el tipo de archivo como Categoría y Clase como UIFont, luego haga clic en "Siguiente" seguido de "Crear". "
Declare el método de la categoría: -
Haga clic en "UIFont + CustomFonts.h" para ver el archivo de encabezado de la nueva categoría. Agregue el siguiente código a la interfaz para declarar el método.
@interface UIFont (CustomFonts)
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size;
@end
Ahora implemente el método de la categoría: -
Haga clic en "UIFont + CustomFonts.m" para ver el archivo de implementación de la categoría. Agregue el siguiente código para crear un método que establezca la fuente ProductSansRegular.
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size{
return [UIFont fontWithName:@"ProductSans-Regular" size:size];
}
Importa tu categoría
#import "UIFont+CustomFonts.h"
Ahora establece la fuente de la etiqueta
[self.label setFont:[UIFont productSansRegularFontWithSize:16.0]];