📜 ⬆️ ⬇️

We improve labor productivity. Objective-c macros and literals


Hello!
It is no secret that we, programmers, spend at least half the time on writing code. It would be logical for this time to be as short as possible.
Once, when I once again wrote the NSString * construct, 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 analogs:
 [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 the objects are not nil, otherwise get exceptions.
We 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 have different attitudes to macros, however, they can accelerate development well.
I give 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 into <project_name>-Prefix.pch . After that use them in the code. Very convenient.

Note : the user iStyx noticed that it would be nice to wrap the parameters in the macros in brackets, for example
 #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, I use type overrides to move away from the 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 made a superficial examination. Simplify your work, and do not write unnecessary characters (but do not forget about the logical names of variables !!!)

Good luck in your development.

PS User Pilot34 shared his library of auxiliary tools .

Source: https://habr.com/ru/post/159115/


All Articles