
We improve labor productivity. Macros and literals objective-c

Hello!
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.
Literals
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.
Continue
[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.
Macros
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;
Conclusion
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 .