https://github.com/oa414/objc-zen-book-cn/
主要关于代码规范的,最后还讲了一些其他方面;
虽然规范从一开始就整理了好多遍,这个也看过,简单记录下;看看还是很有收获的,尤其是不注意代码规范的孩子;好评。
- 1 条件语句:注意括号,不要省略;
if (!error) {
// do something;
}
- 2 不要使用尤达表达式:推荐使用 变量与常量比较(不要倒过来),或者使用 !(不要使用nil==obj)
// 1
if ([myName isEqualToString:@"说了是村长"]) {
// do something;
}
// 2
if (!error) {
// do success
}
- 3 黄金大道:建议复杂代码不嵌套在 if 内部;
if (error) {
// alert info
return;
}
// do something success important
- 4 复杂的表达式:if 条件复杂时,建议把条件提取出来,写成多个BOOL类型;
if ((isConnected && currentUUID) || isManager) {
// do something
}
- 5 三元运算符:使用是为了使代码更清楚!
// 1
NSString *result = a > b ? x : y;
// 2
NSString *object = @"134";
NSString *result = object ? : @"999";
- 6 错误处理:不要判断error是否存在去处理,而是判断对方法处理结果的BOOL;
NSError *error = nil;
if (![self doSomeThingWithError:&error]) {
// do error thing;
}
- 7 switch case:建议添加括号,使用可枚举变量时建议不使用 default;
switch (type) {
case TestTypeOne: {
//
break;
}
case TestTypeTwo: {
//
break;
}
case TestTypeThree: {
//
break;
}
}
- 8 枚举类型:使用 NS_ENUM(),NS_OPTION();
typedef NS_ENUM(NSUInteger, TestType) {
TestTypeOne,
TestTypeTwo,
TestTypeThree
};
- 9 通用命名:遵守apple命名规定,建议使用长的、描述性的命名
UIButton *settingButton;
- 10 常量命名:添加相关类前缀(私有的常量可以使用k前缀),不建议使用宏定义;
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;
extern const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration;
- 11 方法命名:注意apple风格,注意空格,参数命名,尽量不要出现and;
+ (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle;
- 12 字面量:NSString,NSDictionary,NSArray,NSNumber的创建;
NSString *name = @"说了是村长";
NSNumber *age = @24;
NSArray *friend = @[@"张三",
@"李四",
@"王五"];
NSDictionary *info = @{@"phone":@"514515",
@"address":@"紫金港"};
- 13 类命名:使用三个大写字母作为前缀,包括公开常量,协议,通知等;
BBBViewController
BBBUserInfoChangeNotification;
- 14 使用instancetype 代替 id 作为返回类型;
- (instancetype)initWithFrame:(CGRect)frame;
15 单例:通常公开类方法就足够,不应该将单例作为对象的容器;
16 属性:小写开头,避免缩写;
NSString *text;
17 init 里不要使用getter setter,应该直接访问实例;
18 使用setter getter 方法使用 .符号;
// backgroundColor
self.view.backgroundColor = [UIColor redColor];
- 19 属性定义:nonatomic,readwrite,copy 的选择;
@property (nonatomic, strong) NSTimer *timer ;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) void(^testBlock)();
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, weak) id<TestDelegate>delegate;
- 20 懒加载:重写getter方法,延迟实例化;
- (NSString *)name{
if (!_name) {
_name = @"test";
}
return _name;
}
- 21 使用断言;
NSAssert([@"1" isEqualToString:@"2"], @"你确定 ?");
22 私有方法:不要再私有方法前加上 “_”;
23 相等性:isEqual 和 hash;对象相等 hash一定相对,反之不一定;
24 Categories:方法前添加 小写前缀以及下划线;
+ (instancetype)mj_objectWithKeyValues:(id)keyValues;
- 25 美化:空格,换行,冒号对齐;
// 1,这个我确实一直没这么写,在考虑要不要也改成这么用;
if (a) {
// do
}
else if (b) {
// do
}
else {
// do
}
// 2
- (void)alertMessage:(NSString *)message {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"
message:message
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"知道啦"
style:UIAlertActionStyleCancel
handler:nil];
[alertController addAction:okAction];
[self presentViewController:alertController
animated:YES
completion:nil];
}
- 26 利用代码块:括号内的代码,会返回最后语句的返回值;
NSString *content = @"1234567890";
NSString *subString = ({
NSString *tempString = [content substringWithRange:NSMakeRange(2, 2)];
[NSString stringWithFormat:@"%@%@",tempString,tempString];
});
NSLog(@"%@",subString);// 3434
- 27 pragma:组织代码;
#pragma mark - View lifeCycle
#pragma mark - Methods
#pragma mark - TableView Delegate
#pragma mark - Other Delegate
#pragma mark - Layout Views (处理UI布局,一般storyboard 不需要,代码布局会有大量,对应下面 Getter 也会大量)
#pragma mark - Getter Setter
- 28 warning:手动标记;
#warning i know it will be error sometime; 英语不好没办法,写中文,左边不会显示哦;
29 添加注释;
30 block
31 委托和数据源
32 继承
33 AOP 面向切面编程;