Улучшаем производительность труда. Макросы и литералы objective-c

от автора


Всем привет!
Не секрет, что мы, программисты, минимум половину времени тратим на написание кода. Логично было бы это время как можно лучше сократить.
Однажды, когда я в очередной раз написал конструкцию NSString *, я подумал, что пора что-то менять.
Как же можно упростить себе жизнь, разрабатывая под iOS?
Статья является расширением другой статьи

Литералы

Не так давно, Objective-c стал поддерживать большое количество литералов для уменьшения объема кода.
Все примеры будут актуальны для Xcode 4.5.
Итак, заменяем следующие конструкции на сжатые аналоги:

[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"} 

Следите, чтобы объекты были не nil, иначе получите исключения.
Продолжаем

[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; 

Аналогично можно задавать объекты из переменных. Просто возьмите их в скобки @()

Дальше интереснее!

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; 

В общем, тонна синтаксического сахара.

Макросы

Можно по-разному относиться к макросам, однако же, они могут хорошо ускорить разработку.
Привожу список интересных макросов, подходящих для разработки:

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

Засуньте их в один заголовочный файл и подключите в <project_name>-Prefix.pch. После этого используйте их в коде. Весьма удобно

Переопределения типов

Прежде всего, переопределения типов я использую, чтобы отойти от звезд и префиксов NS. Главное, попривыкнуть к ним.
Вот несколько, например:

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

Заключение

В общем, поверхностное ознакомление мы осуществили. Упрощайте себе работу, и не пишите лишних символов (но не забывайте о логичных названиях переменных!!!)

Удачи в разработке

ссылка на оригинал статьи http://habrahabr.ru/post/159115/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *