2009-08-27 6 views
14

Utilizo una colección de métodos de categoría para las clases integradas de Cocoa para hacer mi vida más fácil. Voy a publicar algunos ejemplos, pero realmente quiero ver lo que otros programadores han propuesto. ¿Qué tipo de métodos de categoría útil son que usar?¿Qué tipo de métodos de categoría usas para hacer la programación de Cocoa más fácil?

Ejemplo # 1:

@implementation NSColor (MyCategories) 
+ (NSColor *)colorWithCode:(long)code 
{ 
    return [NSColor colorWithCalibratedRed:((code & 0xFF000000) >> 24)/255.0 
            green:((code & 0x00FF0000) >> 16)/255.0 
             blue:((code & 0x0000FF00) >> 8)/255.0 
            alpha:((code & 0x000000FF)  )/255.0]; 
} 
@end 

// usage: 
NSColor * someColor = [NSColor colorWithCode:0xABCDEFFF]; 

Ejemplo # 2:

@implementation NSView (MyCategories) 
- (id)addNewSubViewOfType:(Class)viewType inFrame:(NSRect)frame 
{ 
    id newView = [[viewType alloc] initWithFrame:frame]; 
    [self addSubview:newView]; 
    return [newView autorelease]; 
} 
@end 

// usage: 
NSButton * myButton = [someView addNewSubviewOfType:[NSButton class] 
              inFrame:someRect]; 
+0

Debería ser wiki de la comunidad, creo. – jbrennan

Respuesta

1

I tiene algunos métodos ingeniosos en NSDate. Esto se explica por sí:

-(BOOL)isOnTheSameDayAsDate:(NSDate *)date { 

    NSCalendar *cal = [NSCalendar currentCalendar]; 
    NSDateComponents *selfComponents = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
              fromDate:self]; 

    NSDateComponents *dateComponents = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
               fromDate:date]; 

    return (([selfComponents day] == [dateComponents day]) && 
      ([selfComponents month] == [dateComponents month]) && 
      ([selfComponents year] == [dateComponents year])); 

} 

Uso:

if ([aDate isOnTheSameDayAsDate:anotherDate]) { ... } 

Esto proporciona un método para obtener fácilmente las fechas como "09 a.m. el día anterior":

-(NSDate *)dateWithDayDelta:(NSInteger)daysBeforeOrAfter atHour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second { 

    NSDate *date = [self addTimeInterval:(24 * 60 * 60) * daysBeforeOrAfter]; 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit |   
                NSMinuteCalendarUnit | NSSecondCalendarUnit 
             fromDate:date]; 

    [comps setHour:hour]; 
    [comps setMinute:minute]; 
    [comps setSecond:second]; 

    return [calendar dateFromComponents:comps]; 
} 

Uso:

// We want 9am yesterday 
NSDate *nineAmYesterday = [[NSDate date] dateWithDayDelta:-1 
                atHour:9 
                minute:0 
                second:0]; 
+0

cosas buenas. Empecé a trabajar con 'NSCalendar' ayer, ¡así que es perfecto! –

2

Categoría, que agrega md5/sha1 hashing a NSString. NSData uno es similar.

#define COMMON_DIGEST_FOR_OPENSSL 
#import <CommonCrypto/CommonDigest.h> 


@implementation NSString(GNExtensions) 

    - (NSString*) 
    hashMD5 
    { 
     NSData* data = [self dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: NO]; 

     unsigned char hashingBuffer[16]; 
     char outputBuffer[32]; 

     CC_MD5([data bytes], [data length], hashingBuffer); 

     for(int index = 0; index < 16; index++) 
     { 
      sprintf(&outputBuffer[2 * index], "%02x", hashingBuffer[index]); 
     } 

     return([NSString stringWithCString: outputBuffer length: 32]); 
    } 


    - (NSString*) 
    hashSHA1 
    { 
     NSData* data = [self dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: NO]; 

     unsigned char hashingBuffer[20]; 
     char outputBuffer[40]; 

     CC_SHA1([data bytes], [data length], hashingBuffer); 

     for(int index = 0; index < 20; index++) 
     { 
      sprintf(&outputBuffer[2 * index], "%02x", hashingBuffer[index]); 
     } 

     return([NSString stringWithCString: outputBuffer length: 40]); 
    } 


@end 
5

Realmente he sido amante de la categoría "KVO+Blocks" de Andy Matuschak en NSObject. (Sí, agrega algunas clases nuevas internamente como detalles de implementación, pero el resultado final es solo una categoría en NSObject). Le permite proporcionar un bloque que se ejecutará cuando un valor conforme a KVO cambia en lugar de tener que manejar cada observación de KVO en el método observeValueForKeyPath:ofObject:change:context:.

+0

+1 ¡eso es asombroso! –

Cuestiones relacionadas