Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров18K

Всем привет!
Не секрет, что мы, программисты, минимум половину времени тратим на написание кода. Логично было бы это время как можно лучше сократить.
Однажды, когда я в очередной раз написал конструкцию 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. После этого используйте их в коде. Весьма удобно.

Примечание: пользователь iStyx заметил, что параметры в макросах неплохо бы оборачивать в скобки, например так
#define RGB(r, g, b)   [UIColor colorWithRed:(r)/255.f green:(g)/255.f blue:(b)/255.f alpha:1.f]


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


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

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


Заключение


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

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

P.S. Пользователь Pilot34 поделился своей библиотекой вспомогательных инструментов.
Теги:
Хабы:
Всего голосов 20: ↑14 и ↓6+8
Комментарии30

Публикации

Истории

Работа

Swift разработчик
18 вакансий
iOS разработчик
17 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань