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 () <UITableViewDataSource, UITableViewDelegate>

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

@property (nonatomic, copy) NSArray<LQMineData *> *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 .....
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,061评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,407评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,275评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,084评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,091评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,555评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,914评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,900评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,438评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,470评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,596评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,187评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,932评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,361评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,511评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,163评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,671评论 2 366