每个公司都会有代码规范的要求:

规范的代码有利于程序员之间的交流。会催进团队项目的开展。也有利于后期代码的复查和重构等。因此规范的写代码很重要。

以下是我基于 Coding Guidelines for Cocoa一点整理:

使用Tab键:行首“留白”

  • 注意不是使用空格,是Tab键。
  • 一段代码结束后,应该另起一行,并在前面用Tab键“留白”。不过Xcode已经把这点智能化了。按回车后自动处理。
    \"Snip20151219_3\"
  • 在竖直方向上,一段代码块的首尾所在行的“留白”应该一样。如果里面还有不同的逻辑块,每个逻辑块的首尾我们也应该设置相同的“留白”,比它的直接上一级要多一个tab位置的“留白”,使得层次分明。
    \"Snip20151219_10\"

方法和实例变量声明时的文档注释

  • 所有的方法属性声明必须有文档注释。
    \"Snip20151219_16\"
    \"Snip20151219_18\"
  • 这样调用时会出现使用说明:
    \"Snip20151219_15\"
    \"Snip20151219_20\"
  • 传入的参数能否为nil也要在Parameters处进行说明。

方法的分类组织

  • 合理利用#pragma mark对方法进行分类,组织,方便方法查找。特点是一个文件中方法较多时就更显得有必要了。
    \"Snip20151219_17\"

pragma mark - 生命周期方法

  • (void)viewDidLoad {}
  • (void)didReceiveMemoryWarning() {}

pragma mark - 导航条相关

  • (void)setuoNav() {}

方法命名的基本规则

  • 清晰
    • 方法的命名要尽可能清晰和简洁。


insertObject:atIndex:
// 很好,知道应该在Index位置插Object
insert:at:
// 不能明确的说明插入什么,在哪里插入

removeObjectAtIndex:
// 很好,知道要移除(Index)所指的(Object)
removeObject:
// 很好,知道要移除所传入的对象(Objcet)
remove:
// 不清晰,不知道要移除什么

* 通常情况不要缩写,尽管它们可能会很长
* 尽量不要缩写,不然无法见名知意。

destinationSelection
setBackgroundColor:
// 很好
destSel
setBkgdColor:
// 这二个缩写就不好,不能见名知意,你可能认为很好,可是别人不一定接受,要缩写也要缩写成大家都能接受的。

  • 给系统类添加方法的如何命名
    • 应该以比如框架名或者特殊的字母开头 + “_”开头

// 比如SDWebImage,方法名就以sd_开头,就可以和系统的setImage...区分开
- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state;

* 协议方法的命名
* 比如我们要制定一个关于Person类的协议,协议里的方法名就应该以person开头

- (void)personWillStudy:(Person *)person;
- (void)person:(Person *)person WillReadTheBook:(NSString *)bookName;

实例变量的声明

  • 要明确的用weak,strong,assign等关键字修饰
  • 要用nonatomic,atomic关键字进行修饰,一般情况下用nonatomic,atomic基本用不到
  • 如果实例属性只在初始化时赋值,以后都不允许改时请用readOnly关键字修饰
  • 对NSString、NSArray等遵守NSCopying协议的实例变量要用copy关键字修饰

@property (nonatomic, assign, readonly) NSInteger count;
@property (nonatomic, assign) NSInteger count;
@property (nonatomic, strong) Person *person;
@property (nonatomic, copy) NSString *name;

  • 实例变量的类型和要遵守的协议之间不要有空格

@property (nonatomic, strong) id<Protocal> *delegate;
@property (nonatomic, strong) NSObject<Protocol> *object;

  • 对于BOOL类型的实例变量,建议getter方法这样写,比较见名知义

@property (assign, getter=isEditable) BOOL editable;

  • 类的初始化方法返回值要用instancetype,不要用id

// 例如:
- (instancetype)init {
......
}

  • 结构体最好用(如CGRectMake())等函数来初始化

CGRect rect = CGRectMake(3.0, 12.0, 15.0, 80.0);

表达式

  • 只有在-init, -delalloc或其它自定义的构造方法中可以直接访问实例变量(即指用下划线的方式:_age)。其它地方应该使用点语法,点语法的本质是调用setter和getter方法。

[NSFileManager.defaultManager URL..];
person.age = 10; // 本质调用setter方法
int a = person.age // 本质调用getter方法

  • 合理的运用圆括号使表达式易于理解

Blah *a = stuff == thing ? foo : bar; // 不好理解
Blah *a = (stuff == thing ? foo : bar); // 比较好理解

  • “=”、“==” “!=”等符号应两边各留一个空格,将左右两边分开。
  • “;”后面应留一个空格,前面不用。 当然如果“;”后面没东西就不用留了。

for (int i = 0; i < 10; i++) {
doCoolThings();
}

流程控制语句

  • if后面如果有else,那么if后面必须有一个{},把要执行的代码括起来。
  • if后面没有else,且它后面要执行的代码只有一条,那这条要和它在同一行。有多条的话还是要用{}括进来。


// if后面有else
if (a == nil) {
// 要执行的代码
} else {
// 要执行的代码
}

// if后面没有else,且只执行一条代码 return,应放在同一行;
if (a == 5) return;

  • swith 语句,每一个case及default后应对应一个break (注:Swift语法可不加break)

switch (表达式){
case 值1 :
语句1;
break;
case 值2 :
语句2;
break;
...
default :
语句n ;
break;
}

Block

  • block的声明和定义


<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
<#statements#>
};
// 例如:
int (^sumblock3)(int) = ^(int a){
return a + 8;
}

* 小技巧,可以直接敲inlineBlock系统会自动补全block
<a href=\"http://blog.qiji.tech/wp-content/uploads/2015/12/Snip20151219_21.png\"><img src=\"http://blog.qiji.tech/wp-content/uploads/2015/12/Snip20151219_21-300x61.png\" alt=\"Snip20151219_21\" width=\"300\" height=\"61\" class=\"alignnone size-medium wp-image-522\" /></a>
* 如果形参为void,定义时可省略

int (^sumblock3)(void) = ^{
return 5 + 8;
};

  • 定义block时,如果有形参,一定要有形参名。

int (^sumblock2)(int, int) = ^(int a,int b){ // a,b就是形参名,不能省略
return a+b;
};

字面量

  • 定义NSString,NSArray,NSDictionary时最好使用字面量

NSArray *ageArray = @[ @1, @2, @3 ];
NSDictionary *student = @{ @&quot;age&quot;: @15 };

* 如果太长或者太复杂可以换行
NSDictionary *keyedStuff = @{
@&quot;this.key&quot;: @&quot;corresponds to this value&quot;,
@&quot;otherKey&quot;: @&quot;remoteData.payload&quot;,
@&quot;some&quot;: @&quot;more&quot;,
@&quot;JSON&quot;: @&quot;keys&quot;,
@&quot;and&quot;: @&quot;stuff&quot;,
};

枚举

  • 里面的枚举成员应以枚举名开头
    typedef enum {
    UserSexTypeMan = 0,
    UserSexTypeWoman = 1,
    UserSexTypeUnknown = 2,
    } UserSexType;

发表评论

电子邮件地址不会被公开。 必填项已用*标注