Kevin Sylvestre

A Ruby and iOS developer and designer living in Santa Monica, California.
A Ruby and iOS developer and designer living in Santa Monica, California.
  • About
  • Contact
  • rss
  • archive
  • Extending Objects in Cocoa With Categories

    Cocoa extensions provide a great way to modify existing classes with additional functionality. Here is a good example of extensions in action:

    NSDate+Accessors.h

    //
    //  NSDate+Accessors.h
    //  Illustrate
    //
    //  Created by Kevin Sylvestre on 10-03-24.
    //  Copyright 2010 Kevin Sylvestre. All rights reserved.
    //
    
    @interface NSDate (Accessors)
    
    @property (nonatomic, retain, readonly) NSString *distance;
    
    @end
    

    NSDate+Accessors.m

    //
    //  NSDate+Accessors.m
    //  Illustrate
    //
    //  Created by Kevin Sylvestre on 10-03-24.
    //  Copyright 2010 Kevin Sylvestre. All rights reserved.
    //
    
    #import "NSDate+Accessors.h"
    
    @implementation NSDate (Accessors)
    
    # define SINGULAR (1)
    
    - (NSString *)distance
    {
      // Load interval.
      NSTimeInterval interval = [self timeIntervalSinceNow];
    
      // Calculate interval.
      NSInteger seconds = round(abs(interval));
      NSInteger minutes = round(abs(interval) / 60);
      NSInteger hours   = round(abs(interval) / 3600);
      NSInteger days    = round(abs(interval) / 86400);
      NSInteger weeks   = round(abs(interval) / 604800);
      NSInteger months  = round(abs(interval) / 2629743);
      NSInteger years   = round(abs(interval) / 31556926);
    
      // Calculate direction.
      NSString *direction;
      if (interval > 0) direction = @"until";
      if (interval < 0) direction = @"ago";
    
      // Create unit and amount.
      NSString *unit = nil;
      NSInteger amount;
    
      // Set unit and amount.
      if (interval == 0);
      else if (years)   { amount = years;   unit = amount == SINGULAR ? @"year"   : @"years";   }
      else if (months)  { amount = months;  unit = amount == SINGULAR ? @"month"  : @"months";  }
      else if (weeks)   { amount = weeks;   unit = amount == SINGULAR ? @"week"   : @"weeks";   }
      else if (days)    { amount = days;    unit = amount == SINGULAR ? @"day"    : @"days";    }
      else if (hours)   { amount = hours;   unit = amount == SINGULAR ? @"hour"   : @"hours";   }
      else if (minutes) { amount = minutes; unit = amount == SINGULAR ? @"minute" : @"minutes"; }
      else if (seconds) { amount = seconds; unit = amount == SINGULAR ? @"second" : @"seconds"; }
      else return @"now";
    
      // Format string and return.
      return [NSString stringWithFormat:@"%i %@ %@", amount, unit, direction];
    }
    
    @end
    

    Accessing extensions is simple: just import the header file. In the case above, easily readable dates are now at the finger tips!

    • March 24, 2010 (5:14 am)
    • #apple
    • #cocoa
    • #iphone
    • #ipad
    • #mac
© 2009–2013 Kevin Sylvestre