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

в 10:53, , рубрики: iOS, макросы, разработка под iOS, метки: ,

Улучшаем производительность труда. Макросы и литералы 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;

Заключение

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

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

Автор: Dreddik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js