ios编码规范20200507

代码风格篇

  • 常量

1.宏以小写k开头+模块前缀+具体描述

#define kLQWeakSelf   __weak typeof(self) weakSelf = self

2.全局变量以小写k开头+模块前缀+具体描述,如果是需要供外界模块调用,则在.h文件以extern或者UIKIT_EXTERN声明

/// .h
UIKIT_EXTERN NSString *const kAOrgInfoKey;
/// .m
NSString *const kAOrgInfoKey = @"A_orgInfoKey";

3.property声明中同一类属性放在一块,不同类类换行写,如果可读不可改,则必须使用readonly

@interface LQMineViewController () 

@property (nonatomic, strong) UIView *headView;
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, copy) NSArray *cellDatas;

@end

4.合理使用static,一般使用在单例或者滚动控件cell复用,其命名规范和常量一样

static NSString *kAMineCellIdentifier = @"A_mineCellIdentifier";

5.通知以小写k开头+模块前缀+Noti+具体描述

#define kANotiCompanyChanged  @"A_notiCompanyChanged"

6.自定义block,以模块前缀+描述+block

typedef void (^DServiceViewBlock)(NSString *selectedTitle);
  • 方法编写规范
    1.前括号提至方法后
    2.同一模块功能代码写在一起
    3.不同模块功能换行写
    4.系统的方法重写不写具体细节,细节实现以自定义方法加载
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setupHeadView];
    [self setupTableView];
    
    [self getCellDatas];
}
  • 方法归类
#pragma mark --- life cycle

///code ...
///上空一行
///下空一行

#pragma mark --- event

///code ...
///上空一行
///下空一行

#pragma mark --- request

///code ...
///上空一行
///下空一行

#pragma mark --- xxxDelegate

///code ...
///上空一行
///下空一行

#pragma mark --- lazy

  • UIViewController方法分类
#pragma mark --- life cycle

- (instancetype)init
- (instancetype)initWithCoder:(NSCoder *)coder
- (void)loadView
- (void)viewDidLoad 
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillLayoutSubviews
- (void)viewDidLayoutSubviews
- (void)delloc
以上是属于life cycle的,子控件在`viewDidLoad `写入,frame更新在`viewWillLayoutSubviews`中完成

#pragma mark --- lazy
主要完成子控件的创建、属性的设置
- (ExtendClickButton *)backBtn {
    if (!_backBtn) {
        _backBtn = [[ExtendClickButton alloc] init];

        [_backBtn setImage:kLQImageNamed(@"LR_ArrowLeftBlack") forState:UIControlStateNormal];
        _backBtn.leftX = (_backBtn.rightX = 10);
        _backBtn.top   = (_backBtn.bottom = 10);

        _backBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

        [_backBtn addTarget:self action:@selector(p_clickBackButton:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _backBtn;
}
不在懒加载里实现加入类似 `[self.view addSubview: _backBtn]`
  • 类声明
    注明类的用途,属性和方法的注释,同类一块,非同类换行分离;少用#import,多用@class,@protocol
#import "LQBaseViewController.h"

///新账号登录
@interface LRNewAccountController : LQBaseViewController

///验证码验证成功回调
@property (nonatomic, copy) dispatch_block_t codeSuccessBlock;
///成功登录回调,如果为空则默认切换为主入口
@property (nonatomic, copy) dispatch_block_t logSuccessBlock;

///默认手机号,非必传
@property (nonatomic, copy) NSString* phone;

@end

模块层级划分

以下为模块内部的架构图


image.gif
  • 主模块由公共部分和私有部分组成
  • 公共部分由Header、Home Controller和Public组成。Public由共享给外部的文件和Mediator分类组成,是其他模块访问该模块的api集合。Header里主要放置的是预编译的.h文件、模块公开的常量/宏、通知等。之所以把Home Controller放在模块最外层暴露,是为了开发人员快速的找到模块入口
  • 私有部分,是模块内部业务处理部分,是不允许模块外直接访问修改引用的。主要由Home,Actions和Sub Modules组成
  • Home:放置模块首页的功能文件,根据功能的复杂程度可以分为普通模式和子模块模式。如果首页简单,则可直接把view/model等直接放置在一起;若首页比较复杂,可以采取子块分隔的方式组织,每个子块内部根据业务复杂度又可按照整个Module Architecture递归拆解。
  • Actions:模块方法api集合,分为Module-In Api和Module-Out Api。Module-In Api:主要是供内部子模块使用,原则上各个子模块内是单独封闭的,不能直接访问,主要是为了以后维护方便,根据后期发展子模块根据体量大小可单独抽离成一个Main Module。另外Module-In Api的方法定义不能以Action_native开头,用于区别内外之别
    Module-Out Api:主要是供模块外使用,按照严格的命名格式定义selector name,以Action_native开头
  • Sub Modules:子模块,根据Main Module包含的业务板块进行划分,必须很熟悉Main Module的产品功能和未来可能的走向,sub module不在功能多少或复杂度,主要以功能的唯一性、同理性且整体的形成一个完成的功能闭环为拆分标准。这些子模块如何组织业务代码,这里没做任何限制,mvc、mvp、mvvm都可以,那种方式适合就使用那种。子模块拆分合理,以后对于业务扩张分隔非常有用。
    image.png

暗黑模式适配

(系统:iOS13及以上)暗黑模式适配就是文字颜色、背景颜色、图片的适配,颜色主要是黑白灰,其他彩色的不变。

  • 颜色适配
    颜色适配统一更改为设置系统动态颜色值,去除配置color set中的可视化配置,并配合宏可自定义系统动态颜色宏
/// 如果系统版本大于器或者等于13.0,则为设置系统动态颜色,其他则只是设置lightColor
/// @param lightColor 正常模式颜色,hex string
/// @param darkColor 暗黑模式颜色,hex string
+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor darkColor:(NSString *_Nonnull)darkColor;
+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor lightAlpha:(CGFloat)lightAlpha darkColor:(NSString *_Nonnull)darkColor darkAlpha:(CGFloat)darkAlpha;

+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor darkColor:(NSString *_Nonnull)darkColor {
    return [self dynamicLightColor:lightColor lightAlpha:1.0 darkColor:darkColor darkAlpha:1.0];
}
+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor lightAlpha:(CGFloat)lightAlpha darkColor:(NSString *_Nonnull)darkColor darkAlpha:(CGFloat)darkAlpha {
    if (@available(iOS 13.0, *)) {
        UIColor* color = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
            if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
                return [[UIColor colorWithHexString:darkColor] colorWithAlphaComponent:darkAlpha];
            }else {
                return [[UIColor colorWithHexString:lightColor] colorWithAlphaComponent:lightAlpha];;
            }
        }];
        return color;
    }else {
        return [[UIColor colorWithHexString:lightColor] colorWithAlphaComponent:lightAlpha];;
    }
}

///系统宏
#define kLQDynamicColor(light,dark) ([UIColor dynamicLightColor:light darkColor:dark])
#define kLQDynamicColorAlpha(light,alpha1,dark,alpha2) ([UIColor dynamicLightColor:light lightAlpha:alpha1 darkColor:dark darkAlpha:alpha2])

#define kLQAlertBGColor        kLQDynamicColor(@"FFFFFF",@"2E2E2E")
#define kLQAlertLineColor      kLQDynamicColor(@"E5E5E5",@"414141")
#define kLQAlertSVBGColor      kLQDynamicColor(@"E5E5E5",@"232323")
#define kLQBackgroundColor     kLQDynamicColor(@"F7F7F7",@"000000")
#define kLQBarIconColor        kLQDynamicColorAlpha(@"575757",1.0,@"FFFFFF",0.65)
#define kLQBlackColor          kLQDynamicColor(@"000000",@"FFFFFF")
#define kLQCardColor           kLQDynamicColor(@"FFFFFF",@"232323")
#define kLQLineColor           kLQDynamicColorAlpha(@"000000",0.1,@"FFFFFF",0.2)
#define kLQNaviBGColor         kLQDynamicColor(@"FFFFFF",@"121212")
#define kLQSearchBGColor       kLQDynamicColor(@"F2F2F2",@"232323")
#define kLQWhiteColor          kLQDynamicColor(@"FFFFFF",@"121212")
#define kLQAuxiliaryColor      kLQDynamicColorAlpha(@"999999",1.0,@"FFFFFF",0.6)
#define kLQContentColor        kLQDynamicColorAlpha(@"575757",1.0,@"FFFFFF",0.85)
#define kLQDisableColor        kLQDynamicColorAlpha(@"CCCCCC",1.0,@"FFFFFF",0.45)
#define kLQPlaceHoldColor      kLQDynamicColorAlpha(@"BBBBBB",1.0,@"FFFFFF",0.55)
#define kLQSecondaryColor      kLQDynamicColorAlpha(@"7D7D7D",1.0,@"FFFFFF",0.65)
#define kLQTitleColor          kLQDynamicColorAlpha(@"0A0A17",1.0,@"FFFFFF",1.0)
  • 图片适配
    图片适配统一使用创建image set来设置dark image

    image.png

  • 特殊处理
    1.CALayer相关颜色和图片设置设置动态颜色或者图片无效,这时需根据控件的UITraitEnvironment协议里的方法去手动处理

- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    self.layer.backgroundColor = kLQWhiteColor;
    self.layer.image .....
}

你可能感兴趣的:(ios编码规范20200507)