美文网首页
ios编码规范20200507

ios编码规范20200507

作者: 蜗牛的马达 | 来源:发表于2020-05-07 11:58 被阅读0次

    代码风格篇

    • 常量

    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 .....
    }
    

    相关文章

      网友评论

          本文标题:ios编码规范20200507

          本文链接:https://www.haomeiwen.com/subject/uqhoghtx.html