Literals in Objective C

Objective C is not a pure Object-Orientated language, which means you often need to convert between primitive/basic types (like char or int) and objects (like NSValue or NSNumber). This is usually rather tedious and results in large amounts of boilerplate code.

animation.fromValue = [NSNumber numberWithDouble:0.0];
animation.toValue = [NSNumber numberWithDouble:2*M_PI];

This is especially true when dealing with dictionaries – dictionaries only accept objects which means all primitive types must be boxed and unboxed. I was pleased to discover that there is a nice shorthand when dealing with these situations.

For example, the following 2 lines are equivalent.

animation.toValue = [NSNumber numberWithDouble:2*M_PI];
animation.toValue = @(2*M_PI);

Apart from wrapping an expression (as I’ve done) there is a whole list of literals available with NSNumber:

NSNumber *letter = @'G';              // same as [NSNumber numberWithChar:'G']

  NSNumber *thirteen = @13;             // same as [NSNumber numberWithInt:13]
  NSNumber *thirteenUnsigned = @13U;    // same as [NSNumber numberWithUnsignedInt:13U]
  NSNumber *thirteenLong = @13L;        // same as [NSNumber numberWithLong:13L]
  NSNumber *thirteenLongLong = @13LL;   // same as [NSNumber numberWithLongLong:13LL]

  NSNumber *piFloat = @3.141592654F;    // same as [NSNumber numberWithFloat:3.141592654F]
  NSNumber *piDouble = @3.1415926535;   // same as [NSNumber numberWithDouble:3.1415926535]

  NSNumber *yesNumber = @YES;           // same as [NSNumber numberWithBool:YES]
  NSNumber *noNumber = @NO;             // same as [NSNumber numberWithBool:NO]

There are also literals available with arrays and dictionaries:

NSArray *animations = @[right, left, rightAgain, leftAgain];
NSDictionary *info = @{@"id" : id, @"name" : name};

While it still feels a bit clunky (especially if you’re coming from a pure object-orientated language like Ruby), it certainly makes things easier. Happy coding.