2009-08-27 5 views
14

J'utilise une collection de méthodes de catégories pour les classes intégrées de Cocoa afin de faciliter ma vie. Je vais poster quelques exemples, mais je veux vraiment voir ce que les autres codeurs ont mis au point. Quel genre de méthodes de catégorie pratique sont vous utilisant?Quels types de méthodes de catégorie utilisez-vous pour faciliter la programmation Cocoa?

Exemple # 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]; 

Exemple # 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

Devrait être wiki de la communauté je pense. – jbrennan

Répondre

1

J'ai quelques méthodes astucieuses sur NSDate. Ceci est explicite:

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

} 

Utilisation:

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

Cette méthode permet d'obtenir facilement les dates comme "9 heures la veille":

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

Utilisation:

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

Bonnes choses. J'ai juste commencé à travailler avec 'NSCalendar' hier, donc c'est parfait! –

2

Catégorie qui ajoute md5/sha1 hacher à NSString. NSData est similaire.

#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

J'ai vraiment été loving catégorie "KVO+Blocks" de Andy Matuschak sur NSObject. (Oui, il ajoute de nouvelles classes en interne en tant que détails d'implémentation, mais le résultat final est juste une catégorie sur NSObject). Il vous permet de fournir un bloc à exécuter lorsqu'une valeur conforme à KVO change plutôt que de devoir gérer chaque observation KVO dans la méthode observeValueForKeyPath:ofObject:change:context:.

+0

+1 c'est génial! –

Questions connexes