良好的OC代码风格

 CodingGuidelines

约定

命名

/*

 * 属性、变量、方法等采用小驼峰式命名法,小写开头;

 * 类、类别、枚举、全局变量、block声明时加前缀,如:WD前缀,大写开头。

 */

typedef void (^WDCodingStyleBlock)(NSString *typeString);


@interface  WDCodingStyle : NSObject


@property (nonatomiccopyWDCodingStyleBlock codingStyleBlock;
@property (nonatomicreadonlyUITableView *tableView;

+ (instancetype)sharedInstance;

- (void)camelCaseClassMethod;


@end

空格

/*

 * 代码缩进按系统默认间隔(4空格)Tab换行;

 * 小括号()内侧不加空格,如:属性声明、方法传参、方法返回参数、条件语句、block等;

 * 定义对象的属性和常量时,属性名和const紧随*号之后,*号与类型之间加空格。

 */

static NSString *const kWDCodingStyleNameKey = @"kWDCodingStyleNameKey";

@property (nonatomicstrongUITableView *tableView;

- (void)camelCaseClassMethod
{

    //Tab换行 

}

点语法

// 使用点语法来访问或者修改属性,方法调用时使用括号

_tableView.backgroundColor = [UIColor whiteColor];

AppDelegate *delegate = [UIApplication sharedApplication].delegate;

属性

/*

 * 私有属性放在.m文件的扩展类中声明;

 * 除了在初始化方法(init、initWithCoder:等)、dealloc方法和自定义的getter/setter方法内部,避免直接访问实例变量。

 */ 

@interface WDCodingStyle ()


@property (nonatomiccopyNSDictionary *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 allocinit];
    });
    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

还有其他的一些正确写法和规范可以参考下面的风格指南。

参考

此文档参考了下面的风格指南:


转载于:https://my.oschina.net/u/928935/blog/522125

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值