代码规范
iOS代码规范
命名
所有命名必须使用英文单词命名,不要拼错单词。原则上不要出现中文拼音命名,但是不绝对。
正确
NSString *myName = @”Lily”;
错误
NSString *myNome = @”Lily”;
类名
由于Objective-C没有命名空间的设计,所以类名加上公司及项目的前缀,前缀全部大写,类名除前缀外,每个单词的首字母大写。
例如云微店的项目缩写是YWD
正确
YWDUserManager,YWDServiceManager,YWDProductManager
错误
UserManager,ServiceManager,Productmanager
数据模型类型用Entity后缀,而且数据模型尽量不包含业务逻辑。瘦模型。
例如
YWDUserEntity
YWDProductEntity
常量
避免出现magic number(未标识作用的常数),而是用常量代替。而常数的宏定义(不建议用宏,而应该用const进行定义)应与它实际使用时的类型相一致。如以3.0来定义浮点类型,用3表示整型。
常量尽量用const进行定义,少用#define,因为const 会帮你检查类型。k+前缀+描述,使用驼峰法。
例如
static NSString * const kYWDAPIUrl = @”http://www。ywd.com”;
static CGFloat const kYWDRefrashHeight = 50.0;
通知(Notification)的命名,应该是k+前缀+描述+Notification
例如
static NSString * const kYWDUserDidLoginNotification = @”YWDUserDidLoginNotification”;
static NSString * const kYWDUserDidLogoutNotification = @”YWDUserDidLogoutNotification”;
变量
首字母小写,之后每一个新单词的首字母都是大写
变量名必须清晰的表达是变量代表什么
正确
NSString *cityName = @”北京”;
NSString *detailTitle = @”我要卖一个二手车”;
错误
NSString *theT = @”我有一个二手车”
for循环中的游标变量,可以使用单字母的变量。foreach中的变量,可以尽量简单。
for (int i = 0; i < 10; i++) {
NSLog(@”%d”,i);
}
对于简单的数据类型,比如NSString,NSNumber,BOOL,不建议加类型后缀。BOOL要加is前缀。但是,NSDictory,NSArray,NSSet要加类型后缀,不需要标明是否可变。
例如
NSString *accountName;
NSMutableArray *houseItemArray;
NSArray *apiHeaderArray;
NSDictory *keyDict;
BOOL isUpdated;
对于非简单类型,比如UIView,UIButton,Manager等,建议加上后缀
例如
UIView *moreView;
UIButton *downloadBtn;
GJFileManager *fileManager;
对于私有变量,尽量在.m中的category用@property声明,使用xCode自动定义的成员变量。如果自己声明,在.m中声明,且使用前缀”_”
例如
@interface()
@property(nonatomic,copy) NSString *name;
@end
@implement
{
UIEvent *_event;
}
-(instancetype)init
{
if(self = [super init]) {
_name = @”name”;
}
return self
}
@end
操作符
操作符(-、+、*、 /、 = 、 > 、 < 、 == )两侧留空格;*跟随在变量名左边。
例如
NSString *name = @”name”;
if(name.length > 10) {
NSLog(@”%@”,name);
}
返回类型
初始化方法(init、initWith…)的返回值使用intancetype;
例如
正确
-(instancetype)init;
错误
-(id)init;
方法名
方法名尽量可以将方法功能描述清楚,除了首个参数名之外,其他参数的描述参数和实参命名一致,首字母小写,按照驼峰法。在方法修饰符”-” 、”+”之后加一个空格。如果可能最好能描述实现方式。
正确
- (void)getDataWithId:(int)id subId:(int)subId;
错误
-(void)getListWithid:(int)myId categoryId:(int)subId;
例如
- (void)writeToFile;
- (void)writeToMemory;
- (void)writeToFileWithPath:(NSString)path isUpdateName:
- (Bool)isUpdateName;
嵌套方法调用需要用空格分隔
例如
正确
[[NSString alloc] init];
错误
[[NSString alloc]init];
单例方法使用shared前缀
例如
[FileManager shared]
[YWDUserManager shared];
类别category
原类型名”+”前缀+描述
例如
UIView+YWDFrameHelper
枚举
前缀+描述
每一项的命名为:枚举名+描述,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。
例如
正确
typedef NS_ENUM(NSInteger, YWDAPIState){
YWDAPIStateNew = 100,
YWDAPIStateOld = 200
} ;
错误
typedef enum {
YWDAPIStateNew = 100,
YWDAPIStateOld = 200
} YWDAPIState;
容器类操作
NSArray、NSDictionary、NSSet等都使用[]操作符来初始化容器及存取数据
例如
正确:
NSMutableArray *theArray = @[@”val1”,@”val2”];
NSString *name = theArray[0];
theArray[0] = @”newValue”;
NSMutableDictionary *theDic = @{@”key”:@”val”};
NSString *name = theDic[@”key”];
theDic[@”key”] = @”name”;
错误:
NSMutableArray = [NSMutableArray arrayWithObjects:@”val1”,@”val2”,nil];
NSString *name = [theArray objectAtIndex:0];
NSString *name = [theDic objectForKey:@”key”];
数字类型装箱
使用@操作符进行装箱
例如
正确:
int idx = 0;
theArray[0] = @idx;
BOOL isLoaded = YES;
theArray[0] = @isLoaded;
错误:
theArray[0] = [NSNumber numberWithInt:idx];
其他
所有的if判断都需要加上”{}”,包括单行语句
例如
正确:
if(i < 10) {
doSomething();
}
错误:
if(i < 10)
doSomething();
所有的ViewController在命名的时候以ViewController结尾。
例如
YWDProductViewController
YWDUserDetailViewController
所有的UITableViewCell,或者UICollectionViewCell类应该以Cell结尾,并且需要描述哪个业务或者模块的Cell。
例如
YWDProductListCell
YWDUserListCell
三元操作符尽量使用一层逻辑,避免多重三元操作符的使用。
正确:
NSInteger value = 5;
result = (value != 0) ? x : y;
BOOL isHorizontal = YES;
result = isHorizontal ? x : y;
错误
result = a > b ? x = c > d ? c : d : y;
代码组织
相关的方法都用#pragma mark标识
例如
pragma mark UITableViewDelegate Methods
pragma mark Public Methods
pragma mark Private Methods
pragma mark Life Cycle Methods
如果不容易表达,可以在mark后面写上中文
最佳实践
尽量用NSInteger和NSUInteger 替换int和long,因为NSInteger和NSUInteger兼容64-bit和32-bit,同理用CGFloat替换float
禁止在if中把BOOL类型的变量,直接和YES/NO,做比较,因为BOOL的类型是signed char,意味着BOOL不只有YES(1)和NO(0)两个值,在转换成YES/NO的时候,取决于最后一个字节,所以和我们想象的逻辑有可能不同。
正确
BOOL isOk = NO;
if (isOk) {
NSLog(@”进入”);
}
错误
BOOL isOk = NO;
if (isOk == NO) {
NSLog(@”进入”);
}
命名NSString的property的时候,使用copy,因为如果你给某个对象的NSString属性设置的字符串,然后进行了修改,那么会影响到那个属性的值。Block类型也要用copy修饰,防止对象被分配到栈上。
推荐
@property (nonatomic,copy) NSString *titleString;
@property (nonatomic,copy) void(^blockProperty)();
不推荐
@property (nonatomic,strong/retain) NSString *titleString;
@property (nonatomic,strong/retain) void(^blockProperty)();
参考文档
Google Objective-C Style Guide
raywenderlich Objective-C Style
Apple Coding Guidelines for Cocoa
导航菜单
登录页面讨论阅读查看源代码查看历史
首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
打印版本
固定链接
页面信息
本页面最后修改于2015年12月1日 (星期二) 07:15。
隐私政策关于ywd_wiki免责声明Powered by MediaWiki