Какие методы категорий вы используете, чтобы упростить программирование Какао? - PullRequest
14 голосов
/ 27 августа 2009

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

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

Ответы [ 4 ]

5 голосов
/ 27 августа 2009

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

3 голосов
/ 29 августа 2009

Регулярные выражения с RegexKitLite . Загрузить @ RegexKitLite-3.1.tar.bz2

2 голосов
/ 27 августа 2009

Категория, которая добавляет хэширование 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
1 голос
/ 27 августа 2009

У меня есть несколько изящных методов на 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:00 за день до»:

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