Changes in new versions / Objective-C 2012: Literals

// *** before: ***
// a collection holds objects only, so every number had to be wrapped by hand
NSNumber *count = [NSNumber numberWithInt:42];
NSNumber *ratio = [NSNumber numberWithDouble:1.5];
NSNumber *flag = [NSNumber numberWithBool:YES];
NSNumber *letter = [NSNumber numberWithChar:'a'];

NSArray *values = [NSArray arrayWithObjects:
                   [NSNumber numberWithInt:1],
                   [NSNumber numberWithInt:2], nil];

// *** in version 2012: ***
// the @ sign in front of a C literal makes an NSNumber out of it
NSNumber *count = @42;
NSNumber *ratio = @1.5;
NSNumber *flag = @YES;
NSNumber *letter = @'a';
NSNumber *big = @42ULL;      // the C suffix picks the type as usual

NSArray *values = @[@1, @2, @3];

// reading is unchanged
int back = count.intValue;
BOOL raw = flag.boolValue;

// ⚠️ @"text" is a string and has been there since the beginning; @42 is a
// number object. @0 is not nil and not NO: it is a real object, so
// if (@0) is always true