iOS开发规范

2020-05-22  本文已影响0人  白石洲霍华德

iOS开发规范

前言

由于每个开发者的编码习惯和风格都不一样,为了保证开发效率,减轻代码阅读成本,随着以后 APP 业务线越来越大,代码量越来越多时,能保障代码的可维护性,降低维护成本,方便高效定位解决问题,所以从项目的细节到整体都希望根据此文档来达到风格统一,利于维护。

一、命名规范

不论是类名,属性,变量,常量,方法,命名应该清晰明了,表达准确,能够望名知意,尽量不要使用缩写,更不要使用中文拼音。

1.1 类(Class)

示例:

///(C)控制器
BCExchangeRecordController
///(V)视图
BCExchangeRecordCell
///(M)模型
BCExchangeRecordModel

1.2 缩写

通常,我们都不应该缩写命名。然而,下面所列举的都是一些众所周知的缩写,我们可以继续使用这些古老的缩写。在其他情况下,我们需要遵循下面两条缩写建议:

我们也可以使用计算机行业通用的缩写。包括但不限于HTML、URL、RTF、HTTP、TIFF、JPG、PNG、GIF、LZW、ROM、RGB、CMYK、MIDI、FTP。

1.3 属性&局部变量&成员变量&参数名

示例:

/// 版本号
@property (nonatomic, copy) NSString *versionNumber;

1.4 宏定义&局部常量&全局常量

示例:

/// 局部常量,只定义在 .m 文件中,不对外暴露
static const NSTimeInterval kAnimationDuration = 0.25;
static NSString *const kPropertyKey = @"xxxxx";

/// 常量宏
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)

/// 预编译宏
#if RELEASE

#elif DEV

#endif

/**全局常量 */ 
/// 在 .h 文件定义
extern NSString *const BCUpdateUserInfoNotification;

/// 在 .m 文件实现
NSString *const BCUpdateUserInfoNotification = @"BCUpdateUserInfoNotification";

1.5 通知(Notification)

示例:

/// 在 .h 文件定义
extern NSString *const BCUpdateUserInfoNotification;

/// 在 .m 文件实现
NSString *const BCUpdateUserInfoNotification = @"BCUpdateUserInfoNotification";

1.6 枚举(Enum)

使用 NS_ENUM 定义通用枚举,NS_OPTIONS 定义位移枚举
示例:

/// 通用枚举示例
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};

/// 位移枚举示例
typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,
    UIControlStateDisabled     = 1 << 1,
};

1.7 方法(Method)

示例:

/** 类方法,无返回值 */
+ (void)appUpdateWithModel:(BCAppUpdateModel *)model;

/** 实例方法,有返回值 */
- (NSObject *)objectWithDictionary:(NSDictionary *)dict;

1.8 类别(Category)

避免category中的方法覆盖系统方法和属性。可以在自定义方法或者属性前加前缀 bc 加下划线来区分。
示例:

/// 属性
@property (nonatomic, strong) NSURL *bc_imageURL;
/// 方法
- (void)bc_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;

二、代码规范

2.1 属性(property)

示例:

/// .h 文件定义
@interface XJWebViewController : UIViewController

/// 是否隐藏 HUD,默认显示,如果隐藏则显示进度条,显示 HUD 时当前 view 不可交互
@property (nonatomic, assign, getter=isHideProgressLoadingView) BOOL hideProgressLoadingView;

/// JS 方法名数组, 用于 js 调用 native
@property (nonatomic, strong, nullable) NSMutableArray <NSString *> *jsMethodArray;

/// wkWebview,对外只读,防止外界对它进行初始化操作
@property (nonatomic, strong, readonly) WKWebView *wkWebView;

/// urlStr,提供给外界赋值
@property (nonatomic, copy) NSString *urlStr;

@end

/// .m 文件的类扩展
@interface XJWebViewController ()

/// 对内可读写操作的 wkWebView
@property (nonatomic, strong) WKWebView *wkWebView;

#pragma mark - getters and setters
 - (void)setWkWebView
 - (WKWebView *)wkWebView
 ....

@end

2.2 委托(protocol)

示例:

@class UITableView;

@protocol UITableViewDelegate <NSObject>

@required 
// do something...

@optional
/// 可通过实现此委托方法来设置 cell 的行高。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

@end

@interface UITableView : UIScrollView
/// 委托属性,务必使用 weak 修饰
@property (nonatomic, weak) id<UITableViewDelegate> delegate;

@end

2.3 #import 使用

2.4 代码注释

示例:

/// 注释说明
@property (nonatomic, copy) NSString *placeholder; 

/** 注释说明 */
@property (nonatomic, strong) UIColor *textColor; 

示例:

/**
 调起第三方支付客户端

 @param info 订单信息,微信(传PayReq对象);支付宝(传加密后的订单字符串)。
 @param callback 回调,返回状态码及状态信息。
 */
+ (void)payWithInfo:(id)info callback:(ResultCallback)callback;

三、格式规范

3.1 指针 * 位置

3.2 空格规范

3.3 代码块&缩进

3.4 大括号写法

示例:

- (void)loadServersData {
    dispatch_async(dispatch_get_main_queue(), ^{
        for (NSObject *obj in self.dataSource) {
            // do something...  
        }
    });
}

3.5 if else 分支

示例:

if (!_tableView) {
    // do something...
}

示例:

if (/* 条件表达式 */) {
    // do something...
} else {
    // do something...
}

示例:

if (!user.UserName || !user.UserName.length) return NO;
if (!user.Password || !user.Password.length) return NO;

// do something...

return YES;

示例:

if (condition1 && 
    condition2 && 
    condition3 && 
    condition4) {
    // do something...
}

if ([self canDelete]) {
    // do something...
}

- (BOOL)canDelete {
    BOOL finalCondition1 = condition1 && condition2;
    BOOL finalCondition2 = condition3 && condition4;
    return condition1 && condition2;
}

3.6 Switch 语句

示例:

switch (integer) {  
  case 1:  {
    // do something... 
   }
    break;  
  case 2: {  
    // do something...
    break;  
  }  
  default:{
    // do something...  
    break; 
  }
}

示例:

 switch (self.networkState) {
   case EnumNetworkStateNormal: {
        // do something...
   }
        break;
   case EnumNetworkStateNetError: {
        // do something...
   }
        break;
   case EnumNetworkStateServerError: {
        // do something...
   }
        break;
}

3.7 Method 分组

@property (nonatomic, strong) UIButton *confirmButton;

#pragma mark - Life cycle
viewDidLoad
viewWillAppear
...

#pragma mark - UITableViewDataSource 
    // do something...
    
#pragma mark - UITableViewDelegate  
    // do something...
    
#pragma mark - CustomDelegate
    // do something...
    
#pragma mark - Event respopense
    // do something...
    
#pragma mark - Public Methods
    // do something...
    
#pragma mark - Private Methods
    // do something...

#pragma mark - Getters and setters
 - (void)setConfirmButton
 - (UIButton *)confirmButton
 ....
上一篇下一篇

猜你喜欢

热点阅读