Objective-C代码规范(1)

整理自https://github.com/raywenderlich/objective-c-style-guide
http://wing-of-war.github.io/ios/2014/11/10/Raywenderlich-Objective-C-style-guide-CN.html
语言:使用美式英语 myColor>myColour(大于号代表优于)
代码组织:

  • 使用#pragma mark - 把相同的代码放在同一代码区中
  • 保持.h.m 文件内的代码块一只与顺序一致
  • 如果有次分组,使用pragma mark 划分子代码区

空格:

  • Xcode默认换行是4个空格,推 荐使用2个空格,让代码看起来更紧凑,设置方法:xcode->preferences->Text Editing->Indentation->Indent width。
  • 方法体{}的开始{与方法和if/else/switch/while控制流方法处于同一行,}则需要另起一行。
  • 方法之间应该保持一个空行,有助于保持清晰的结构。
  • 推荐使用auto-property-synthesis自动生成属性的Set,Get方法;
  • 如果需要,每一个@synthesize 和 @dynamic都应该独占一行。
  • 多个回调模块,使用{}括号的对齐比使用 方法名中的:对齐要便于阅读。
    // blocks are easily readable
    [UIView animateWithDuration:1.0 animations:^{
    // something
    } completion:^(BOOL finished) {
    // something
    }];

注释: 及时更新;复杂的地方才加注释;代码如注释;

命名规范:

  • 鼓励使用完整,并且有描述性的变量名和方法;
  • 三个首字母的缩写仅用于类名和常量之中(并且大写);
  • 常量应以相关类作为前缀+RWTTutorialViewControllerNavigationFadeAnimationDuration>fadetime(原文如此,但是我觉得太长)
  • 使用自动变量赋值方法,而不是自己实现@synthesize。

属性:

  • 属性应以驼峰命名
  • 除了init初始化方法中使用_variableName来获取或者设置值之外,都应该使用self.来获取变量,实例中的值。
  • 本地变量不应该包含下划线。

方法:

  • 方法名和方法类型 (-/+)之间有一个空格。
  • 方法片段间有空格。
  • 多个参数名前的方法要有描述性的关键字,并且不要包含and字段。
    - (id)viewWithTag:(NSInteger)tag;

变量:

  • 除了在流控制方法中的临时变量,变量名应该是有一定描述性的。
  • *与变量名紧靠在一起。
  • 除init,dealloc,set,get等此类方法,应该尽量使用setters和getters。

Preferred:

@interface RWTTutorial : NSObject

@property (strong, nonatomic) NSString *tutorialName;

@end

Not Preferred:

@interface RWTTutorial : NSObject {
  NSString *tutorialName;
}

Property属性:

  • 变量申明时,原子属性在存储之后(和IB拖线保持一致)。
  • 经常变更(NSMutable*)的变量更倾向于使用copy,而不是strong。

点表达式:

  • 点表达式应该是用于获取或者改变属性
  • 其它实例方法,都推荐使用[]括号记法。
    [self.array count]>self.array.count

字面量:

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

常量:

  • 常量使用static与const创建,#define可以用于定义便利方法。

枚举类型:

  • 传统的枚举则让代码看起来更像C。
  • 推荐使用代码提示中宏定义的NS_ENUM()枚举模块来创建,它可以提供更严谨的类型检测和代码补完功能。
    typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
    RWTLeftMenuTopItemMain,
    RWTLeftMenuTopItemShows,
    RWTLeftMenuTopItemSchedule
    };

分支:

  • 每一个case分支下的执行语句,如果只有一行,不加{};
  • 如果case分支下的执行语句有多行,则使用{}划定范围。
  • 相同case分支的条件使用条件继承 fall-through,在上层case中不使用break跳出,直接继承下层case的执行语句。
  • default条件非必需

私有属性:

  • 私有变量应该在类的私有类别中,不需要加private等词语来进行修饰。
  • 私有类别可以在命名为+Private.h的文件里提供

    @interface RWTDetailViewController ()

    @property (strong, nonatomic) GADBannerView *googleAdView;
    @property (strong, nonatomic) ADBannerView *iAdView;
    @property (strong, nonatomic) UIWebView *adXWebView;

    @end

布尔类型:

  • Objective-C使用YES/NO;在CoreFoundation,C和C++中使用true/false
  • 不要把对象直接和YES进行比较
  • 可以覆写类继承自NSOjbect下的-(BOOL)isEqual:(id)obj;方法来类的比较。
  • 如果BOOL变量是形容词,不需要is来进行修饰。

条件:

  • 一定使用{}来划定判断后的执行语句;
  • 即使执行语非常简单,也不能与条件判断在一行。

三元运算符:

  • 只有在确定能够促进代码整洁与清晰的前提下才使用。
  • 三元运算符最好在赋值需要判断时使用。
  • 非BOOL类型变量必须要与其类型变量做出判断后才能使用。
    result = a > b ? x = c > d ? c : d : y; 不推荐

初始化方法:

  • init方法中返回值使用instancetype取代id作为返回。
  • 构造方法同上

CGRect方法:
- 使用CGGeometry方法来获取CGRect结构下的长宽位置值。

Preferred:

CGRect frame = self.view.frame;

CGFloat x = CGRectGetMinX(frame);
CGFloat width = CGRectGetWidth(frame);
CGRect frame = CGRectMake(0.0, 0.0, width, height);

Not Preferred:

CGRect frame = self.view.frame;

CGFloat x = frame.origin.x;
CGFloat width = frame.size.width;
CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };

黄金路径(Golden Path):

  • 条件判断的左侧空间被称为黄金路径或者幸福路径;
  • 减少if的条件的嵌套,扁平化多个返回条件。
  • 函数的多个返回条件是可以接受的。

错误处理:

  • 条件判断错误时,应该是错误变量本身。

单例:

  • 必须线程安全。

笑脸:

使用:]看起来比:)笑得更开心

你可能感兴趣的:(ios移动应用)