We improve labor productivity. Macros and literals objective-c

    It's no secret that we, programmers, spend at least half the time writing code. It would be logical to shorten this time as best as possible.
    Once, when I once again wrote the design NSString *, I thought it was time to change something.
    How can you simplify your life by developing for iOS?
    The article is an extension of another article.


    Not so long ago, Objective-c began to support a large number of literals to reduce the amount of code.
    All examples will be relevant for Xcode 4.5.
    So, we replace the following constructions with compressed analogues:
    [NSArray arrayWithObjects:@"1", @"2", @"3", nil] => @[@"1", @"2", @"3"];
    [NSDictionary dictionaryWithObjects:@"1", @"2", @"3", nil forKeys:@"one", @"two", @"three", nil] => @{@"one" : @"1", @"two" : @"2", @"three" : @"3"}

    Make sure that objects are not nil, otherwise you will get exceptions.
    [NSNumber numberWithChar:'A'] => NSNumber *theA = @'A';          
    [NSNumber numberWithInt:42] =>  NSNumber *fortyTwo = @42;
    [NSNumber numberWithUnsignedInt:42U] => NSNumber *fortyTwoUnsigned = @42U; 
    [NSNumber numberWithLong:42L] => NSNumber *fortyTwoLong = @42L;
    [NSNumber numberWithLongLong:42LL] => NSNumber *fortyTwoLongLong = @42LL;
    //С плавающей точкой
    [NSNumber numberWithFloat:3.141592654F] => NSNumber *piFloat = @3.141592654F;
    [NSNumber numberWithDouble:3.1415926535] => NSNumber *piDouble = @3.1415926535;
    [NSNumber numberWithBool:YES] => NSNumber *yesNumber = @YES;
    [NSNumber numberWithBool:NO] => NSNumber *noNumber = @NO;

    Similarly, you can set objects from variables. Just put them in brackets @ ()

    more interesting!
    NSMutableArray * array = [@[@"1", @"2", @"3"] mutableCopy] ;
    [array objectAtIndex:0] => array[0];
    array[0] = @"5";
    NSMutableDictionary *dictionary = [@{@"one" : @"1", @"two" : @"2", @"three" : @"3"} mutableCopy];
    NSString *key = @"one";
    oldObject = dictionary[key];
    dictionary[key] = newObject;

    In general, a ton of syntactic sugar.


    You can relate to macros in different ways, however, they can speed up development well.
    Here is a list of interesting macros suitable for development:
    #define ApplicationDelegate                 ((MyAppDelegate *)[[UIApplication sharedApplication] delegate])
    #define UserDefaults                        [NSUserDefaults standardUserDefaults]
    #define SharedApplication                   [UIApplication sharedApplication]
    #define Bundle                              [NSBundle mainBundle]
    #define MainScreen                          [UIScreen mainScreen]
    #define ShowNetworkActivityIndicator()      [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
    #define HideNetworkActivityIndicator()      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
    #define NetworkActivityIndicatorVisible(x)  [UIApplication sharedApplication].networkActivityIndicatorVisible = x
    #define NavBar                              self.navigationController.navigationBar
    #define TabBar                              self.tabBarController.tabBar
    #define NavBarHeight                        self.navigationController.navigationBar.bounds.size.height
    #define TabBarHeight                        self.tabBarController.tabBar.bounds.size.height
    #define ScreenWidth                         [[UIScreen mainScreen] bounds].size.width
    #define ScreenHeight                        [[UIScreen mainScreen] bounds].size.height
    #define TouchHeightDefault                  44
    #define TouchHeightSmall                    32
    #define ViewWidth(v)                        v.frame.size.width
    #define ViewHeight(v)                       v.frame.size.height
    #define ViewX(v)                            v.frame.origin.x
    #define ViewY(v)                            v.frame.origin.y
    #define SelfViewWidth                       self.view.bounds.size.width
    #define SelfViewHeight                      self.view.bounds.size.height
    #define RectX(f)                            f.origin.x
    #define RectY(f)                            f.origin.y
    #define RectWidth(f)                        f.size.width
    #define RectHeight(f)                       f.size.height
    #define RectSetWidth(f, w)                  CGRectMake(RectX(f), RectY(f), w, RectHeight(f))
    #define RectSetHeight(f, h)                 CGRectMake(RectX(f), RectY(f), RectWidth(f), h)
    #define RectSetX(f, x)                      CGRectMake(x, RectY(f), RectWidth(f), RectHeight(f))
    #define RectSetY(f, y)                      CGRectMake(RectX(f), y, RectWidth(f), RectHeight(f))
    #define RectSetSize(f, w, h)                CGRectMake(RectX(f), RectY(f), w, h)
    #define RectSetOrigin(f, x, y)              CGRectMake(x, y, RectWidth(f), RectHeight(f))
    #define DATE_COMPONENTS                     NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
    #define TIME_COMPONENTS                     NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit
    #define FlushPool(p)                        [p drain]; p = [[NSAutoreleasePool alloc] init]
    #define RGB(r, g, b)                        [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]
    #define RGBA(r, g, b, a)                    [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]

    Put them in one header file and plug them in -Prefix.pch. After that use them in the code. Very convenient.

    Note : iStyx user noticed that it would be nice to wrap the parameters in macros in brackets, for example like this
    #define RGB(r, g, b)   [UIColor colorWithRed:(r)/255.f green:(g)/255.f blue:(b)/255.f alpha:1.f]

    Type overrides

    First of all, type redefinitions I use to move away from stars and NS prefixes. The main thing is to get used to them.
    Here are a few, for example:

    typedef NSString*                           String;
    typedef NSNumber*                           Number;
    typedef NSArray*                            Array;
    typedef NSMutableArray*                     MutableArray;
    typedef NSDictionary*                       Dictionary;
    typedef NSMutableDictionary*                MutableDictionary;


    In general, we carried out a superficial familiarization. Simplify your work, and do not write extra characters (but do not forget about the logical names of variables !!!)

    Good luck in the development.

    PS User Pilot34 shared his library of auxiliary tools .

    Also popular now: