Some guidelines for writing statements and variables in Objective C programming are recommended

  • 2020-05-27 07:14:37
  • OfStack

statements
Conditional statements

The conditional body should always be surrounded by braces. Only 1 line of code had better be added, otherwise it will cause a security hazard.


// recommended
if (!error) {
    return success;
} // Is not recommended
if (!error)
    return success; if (!error) return success;

Yoda expression (Yoda)

Do not use yoda expressions. (the name comes from yoda's way of speaking in Star Wars, always in reverse order.)


// recommended
if ([myValue isEqual:@42]) { ... // Is not recommended
if ([@42 isEqual:myValue]) { ...

Inspection of nil and BOOL

1 some people like to check nil in this way:


if (nil == myValue) { ...

This avoids one less "= "error, because if one fewer "=" is written, nil will not be assigned, and the compiler will report an error.

But as mentioned earlier, it's best not to use yoda expressions. So a better solution is to use "!" To complete the nil and BOOL checks.


// recommended
if (someObject) { ...
if (![someObject boolValue]) { ...
if (!someObject) { ... // Is not recommended
if (someObject == YES) { ... // Wrong
if (myRawValue == YES) { ... // Never do this.
if ([someObject boolValue] == NO) { ...

Do not nest multiple if statements

Instead of nesting multiple if statements, use multiple return statements to avoid complexity and improve code readability.

That is, in a method, try not to put the important part in the if statement, but put the "other case" in if.


// recommended
- (void)someMethod {
  if (![someOther boolValue]) {
      return;
  }   //Do something important
} // Is not recommended
- (void)someMethod {
  if ([someOther boolValue]) {
    //Do something important
  }
}

Complex expression

When a judgment condition is complex, it should be extracted and assigned to an BOOL variable.


BOOL nameContainsSwift  = [sessionName containsString:@"Swift"];
BOOL isCurrentYear      = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession     = nameContainsSwift && isCurrentYear; if (isSwiftSession) {
    // Do something very cool
}

The 3 meta operator

The 3 meta operator ensures readability.


// recommended
result = a > b ? x : y; // Is not recommended
result = a > b ? x = c > d ? c : d : y;

When the second argument of the 3 meta-operator (if branch) returns an object like the one already checked in the conditional statement, the following expression is more clever:

// recommended
result = object ? : [self createObject]; // Is not recommended
result = object ? object : [self createObject];

Error handling

When using a method that returns a reference to error via a parameter, you should check the return value of the method, not the error reference.


// recommended
NSError *error = nil;
if (![self trySomethingWithError:&error]) {
    // Handle Error
}

case in switch statement, if there is only 1 line of code, you don't need curly braces, but multiple lines do.

switch (condition) {
    case 1:
        // ...
        break;
    case 2: {
        // ...
        // Multi-line example using braces
        break;
       }
    case 3:
        // ...
        break;
    default:
        // ...
        break;
}

Enumerated type

Enums are defined using the NS_ENUM() macro, which has more powerful type checking and code completion.


typedef NS_ENUM(NSUInteger, ZOCMachineState) {
    ZOCMachineStateNone,
    ZOCMachineStateIdle,
    ZOCMachineStateRunning,
    ZOCMachineStatePaused
};

variable
Use long, descriptive methods and variable names whenever possible.


// recommended
UIButton *settingsButton; // Is not recommended
UIButton *setBut;

Constants should be named after the hump method and prefixed with the associated class name.

// recommended
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4; // Is not recommended
static const NSTimeInterval fadeOutTime = 0.4;

Constants are recommended instead of string literals and Numbers. It can be easily reused and modified quickly.

Constants should be declared as static constants using static, not #define, unless it is explicitly used as a macro.


// recommended
static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification"; static const CGFloat ZOCImageThumbnailHeight = 50.0f; // Is not recommended
#define CompanyName @"Apple Inc."
#define magicNumber 42

If the constant needs to be exposed externally, it should be in the header file as follows:

extern NSString *const ZOCCacheControllerDidClearCacheNotification;

And assign it a value in the implementation file.

Only public constants need to be prefixed with a namespace. Although the naming of private constants in the implementation file can follow another pattern, you can still follow this rule.

A space should be added between the method name and the method type (-/+ symbol).

Method segments should also be separated by Spaces.

The parameter should be preceded by a descriptive keyword.

Use the word "and" as sparingly as possible; it should not be used to clarify that there are multiple parameters.


// recommended
- (void)setExampleText:(NSString *)text image:(UIImage *)image;
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (id)viewWithTag:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height; // Is not recommended
- (void)setT:(NSString *)text i:(UIImage *)image;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
- (id)taggedView:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;
- (instancetype)initWith:(int)width and:(int)height;  // Never do this.

Use literals to create immutable NSString,NSDictionary,NSArray, and NSNumber objects.

In this way, be careful not to put nil in NSArray and NSDictionary, which can cause crashes.


NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018;

Don't:

NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];

Avoid creating mutable arrays in such a way:

// recommended
if ([myValue isEqual:@42]) { ... // Is not recommended
if ([@42 isEqual:myValue]) { ...
8
This approach has problems with both efficiency and readability.

Efficiency: an unnecessary immutable set is discarded immediately after it is created. It is not necessary.

Readability: readability is not good.


Related articles: