2009-08-27 4 views
14

Я использую набор методов категорий для встроенных классов Cocoa, чтобы облегчить мою жизнь. Я приведу несколько примеров, но я действительно хочу посмотреть, что другие кодеры придумали. Какими удобными категориями являются вы используя?Какие методы категорий вы используете для облегчения программирования Cocoa?

Пример # 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]; 

Пример № 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

Должен быть вики-сообщества, я думаю. – jbrennan

ответ

1

У меня есть несколько изящных методов NSDate. Это говорит само за себя:

-(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])); 

} 

Использование:

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

Это обеспечивает способ легко получить даты, как "9 утра на следующий день до":

-(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]; 
} 

Использование:

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

Хороший материал. Я только начал работать с «NSCalendar» вчера, так что это прекрасно! –

2

Категория, которая добавляет md5/sha1 для NSString. NSData один аналогичен.

#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

Я на самом деле был любя "KVO+Blocks" категории Энди Matuschak на NSObject. (Да, он добавляет некоторые новые классы внутри как детали реализации, но конечным результатом является только категория на NSObject). Он позволяет вам создать блок, который будет выполняться при изменении значения, соответствующего KVO, вместо того, чтобы обрабатывать каждые Наблюдение KVO в методе observeValueForKeyPath:ofObject:change:context:.

+0

+1 это потрясающе! –