CodingGuidelines
约定
命名
/*
* 属性、变量、方法等采用小驼峰式命名法,小写开头;
* 类、类别、枚举、全局变量、block等声明时加前缀,如:WD前缀,大写开头。
*/
typedef void (^WDCodingStyleBlock)(NSString *typeString);
@interface WDCodingStyle : NSObject
@property (nonatomic, copy) WDCodingStyleBlock codingStyleBlock;
@property (nonatomic, readonly) UITableView *tableView;
+ (instancetype)sharedInstance;
- (void)camelCaseClassMethod;
空格
/*
* 代码缩进按系统默认间隔(4空格)Tab换行;
* 小括号()内侧不加空格,如:属性声明、方法传参、方法返回参数、条件语句、block等;
* 定义对象的属性和常量时,属性名和const紧随*号之后,*号与类型之间加空格。
*/
static NSString *const kWDCodingStyleNameKey = @"kWDCodingStyleNameKey";
@property (nonatomic, strong) UITableView *tableView;
- (void)camelCaseClassMethod
{
//Tab换行
}
点语法
// 使用点语法来访问或者修改属性,方法调用时使用括号
_tableView.backgroundColor = [UIColor whiteColor];
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
属性
/*
* 私有属性放在.m文件的扩展类中声明;
* 除了在初始化方法(init、initWithCoder:等)、dealloc方法和自定义的getter/setter方法内部,避免直接访问实例变量。
*/
@interface WDCodingStyle ()
@property (nonatomic, copy) NSDictionary *typesAndNames;
@end
方法
/*
* dealloc 方法放在.m文件实现的最上面,init初始化方法紧随其后,init方法返回类型用instancetype,避免用id;
* - 和 + 符号后面空一格,方法间空一行;
* 包含多个参数的方法,命名时避免用“and”拼接方法名。
*/
- (void)dealloc {}
- (instancetype)init {}
- (void)setExampleText:(NSString *)text image:(UIImage *)image;
字面量
/*
* 每当创建 NSString、NSDictionary、NSArray 和 NSNumber 类的不可变实例时,都应该使用字面量;
* 要注意 nil 值不能传给 NSArray 和 NSDictionary 字面量,这样做会导致崩溃。
*/
_typesAndNames = @{ @(WDCodingStyleTypeObjectiveC): @"Objective-C",
@(WDCodingStyleTypeSwift): @"Swift",
@(WDCodingStyleTypeC): @"C"
};
_types = _typesAndNames.allKeys;
_isCodingStyle = @YES;
NSLog(@"typeCount = %@, isCodingStyle = %@", @(_types.count), _isCodingStyle);
常量
/*
* 使用 extern、static 声明常量而不用宏定义,防止值被修改;
* 使用 #define 声明明确要当做宏来使用的常量。
*/
// WDCodingStyle.h
extern NSString *const WDCodingStyleTypeKey;
// WDCodingStyle.m
NSString *const WDCodingStyleTypeKey = @"kWDCodingStyleTypeKey";
static CGFloat const kWDCodingStyleCellHeight = 50.f;
#define TEST YES
枚举类型和位掩码
// 枚举类型采用NS_ENUM声明
typedef NS_ENUM(NSInteger, WDCodingStyleType) {
WDCodingStyleTypeObjectiveC,
WDCodingStyleTypeSwift,
WDCodingStyleTypeC
};
// 位掩码类型采用NS_OPTIONS声明
typedef NS_OPTIONS(NSUInteger, WDCodingStyleState) {
WDCodingStyleStateUnknown = 0,
WDCodingStyleStateNotStart = 1 << 0,
WDCodingStyleStateStartWriting = 1 << 1,
WDCodingStyleStateWriting = 1 << 2,
WDCodingStyleStateStopWriting = 1 << 3,
WDCodingStyleStateDelay = 1 << 10,
WDCodingStyleStateUnFinished = 1 << 11,
WDCodingStyleStateFinished = 1 << 12,
};
布尔类型
/*
* BOOL值用YES/NO标识;
* 条件判断时,对象或数值类型都直接判断变量值,BOOL值永远不要直接和 YES/NO 进行比较。
*/
if (![self.isCodingStyle boolValue]) {
return;
}
if (self.types) {
// do something
}
条件和循环语句
/*
* if/else/for/while/switch等语句在大括号之前只加空格不换行;
* if条件判断主体部分应该始终使用大括号括住来防止出错。
*/
- (void)selectedStyleWithType:(WDCodingStyleType)type
{
if (self.codingStyleBlock) {
if ([self.types containsObject:@(type)]) {
self.codingStyleBlock(self.typesAndNames[@(type)]);
} else {
self.codingStyleBlock(@"Unknown coding style type!!!");
}
}
}
单例
// 单例模式,采用线程安全方式创建共享的实例
+ (instancetype)sharedInstance
{
static WDCodingStyle *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[WDCodingStyle alloc] init];
});
return sharedInstance;
}
类别
// 加小写前缀,如:wd_,用于区分系统框架类(或第三方框架类)的方法,避免原有方法实现被覆盖
@interface NSObject (WDCategory)
- (void)wd_codingStyleMethod;
@end
建议
外部引用
/*
* 避免在.h头文件中过多暴露属性、方法、头文件引用类;
* 尽量使用@class做外部类引用。
*/
#import <Foundation/Foundation.h>
@class UITableView;
代码结构
// Lifecyle
- (void)dealloc {}
- (instancetype)init {}
#pragma mark - Public
- (void)publicMethod {}
#pragma mark - Private(Business)
- (void)privateMethod {}
#pragma mark - Actions
- (IBAction)clickAction:(id)sender {}
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark - NSObject
- (NSString *)description {}
#pragma mark - Categories
@implementation WDCodingStyle (WDTestMethod)
- (void)testMethod {}
@end
还有其他的一些正确写法和规范可以参考下面的风格指南。
参考
此文档参考了下面的风格指南: