美文网首页
IOS基础:编码规范

IOS基础:编码规范

作者: 时光啊混蛋_97boy | 来源:发表于2020-07-06 17:08 被阅读0次

原创:知识点总结性文章
创作不易,请珍惜,之后会持续更新,不断完善
个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的IOS成长历程,希望能与大家一起进步
温馨提示:由于简书不支持目录跳转,大家可通过command + F 输入目录标题后迅速寻找到你所需要的内容

价值

  • 统一团队书写习惯,为效率工具提供了技术模版,奠定了自动化实践的基石
  • 根除阅读障碍,有效降低CR和轮岗成本
  • 增强了团队和谐

变量

  • 只能以字母、数字、下划线、$组成;
  • 不能以数字开头;
  • 遵循小驼峰命名方式;
  • 不能与C语言的关键字重名;new copy
  • 区分大小写;
  • 先声明后使用;
  • 不能重复定义同名变量;
@interface UCARSomeBusinessService () <SomeProtocol, OtherProtocol> {
    // 声明一些私有变量,但不推荐;推荐使用私有属性方式声明
    NSString *title;
    NSInteger count;
}

属性

// 公共属性应该声明在类头文件(.h)中
@interface UCARSomeBusinessService : UCARBaseBusinessService
 
@property (nonatomic, strong) UCARSomeProperty *someProperty;
@property (nonatomic, copy) NSString *otherProperty;
 
@end
 
// 私有属性应该声明在类实现文件(.m)的延展(匿名的类目)中
@interface UCARSomeBusinessService ()
 
@property (nonatomic, strong) UCARSomeProperty *someProperty;
@property (nonatomic, copy) NSString *otherProperty;
 
@end

常量

// 常量格式:常量首选内联字符串字面量或数字,因为常量可以轻易重用并且可以快速改变而不需要查找和替换;
// 常量应该声明为 static 常量而不是 #define ,除非非常明确地要当做宏来使用
static NSString *const viewControllerTitle = @"派单页面";
static const CGFloat cellHeight = 66.66;

枚举

// 枚举格式:关键字、空格、换行、单行注释(居右)按如下书写
typedef NS_ENUM(NSInteger, UCAROrderState) {
    UCAROrderState_Dispatching = 0,     // 派单中
    UCAROrderState_Dispatched  = 1,     // 派单成功
    UCAROrderState_Arrival     = 2,     // 司机已到达
    UCAROrderState_InService   = 3      // 服务中
};
 
// 当用到位掩码时,使用 NS_OPTIONS 宏
typedef NS_OPTIONS(NSUInteger, UCARAdCategory) {
    UCARAdCategoryAutos      = 1 << 0,    // Autos
    UCARAdCategoryJobs       = 1 << 1,    // Jobs
    UCARAdCategoryRealState  = 1 << 2,    // RealState
    UCARAdCategoryTechnology = 1 << 3     // Technology
};

Method

方法定义要遵循单一原则,方法签名不要超过100字符,方法体不宜过长,方法名较短时应单行书写
方法格式:“+/-”+空格+(返回值类型)+方法名+空格+{+换行

- (void)produceView {
    // Do something
}
 
- (UIView *)produceViewWithModel:(UCARModel *)model {
    // Do something
}
 
+ (UIView *)produceViewWithTag:(NSInteger)tag {
    // Do something
}

@protocol

@interface
Delegate尽量使用canshouldwilldid表明回调意愿&时机;
属性&方法添加注释:.h文件中的注释,必须使用 Command + / 生成的模版进行编写
属性&方法过多时,视情况使用 “换行” 分组

// import分组次序:Frameworks、Services、UI
#import <SomeFramework/SomeProtocol.h>
 
@protocol UCARSomeBusinessDelegate <NSObject, UCARSomeDelegate>
@interface UCARSomeBusinessService : UCARBusinessService <UCARSomeBaseService, UCAROtherBaseService>



@required
/**
 * 属性说明
 * @note 额外说明的注意项,说明一些需要注意的地方,没有可取消此项。
 */
@property (nonatomic, copy) NSString *otherProperty;
@property (nonatomic, strong) UCARSomeProperty *someProperty;

/**
 * 方法说明
 * @param object 一个参数
 * @return 一个返回值
 * @note 额外说明的注意项,说明一些需要注意的地方,没有可取消此项。
 */
- (void)shouldUpdateViewWithModel:(UCARSomeViewModel *)model;
- (void)shouldUpdateViewWithError:(NSError *)error;
- (void)willChangeDataSource;
- (void)didChangeDataSource;

@end

@implementation

@class UCARAnyProperty;
#pragma mark - 常量
#pragma mark - 枚举

@interface UCARSomeBusinessService () <SomeProtocol, OtherProtocol> 
#pragma mark - 私有属性
@end

@implementation UCARSomeBusinessService
 
//方法列表使用pragma分组,并遵守如下次序, 且# pragma mark - 与上下各添加一个空行
#pragma mark - Life cycle
 
- (void)someMethod:(UCARSomeModel *)model {
    // Do something
 
    // Block 书写格式
    [UIView animateWithDuration:0.3 animations:^{
        // Do something
    } completion:^(BOOL finished) {
        // Do something
    }];
}
 
#pragma mark - Custom Delegates
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - Getters and Setters
 
@end

UIViewController

#pragma mark - Life cycle
 
- (instancetype)init {
}
 
- (void)viewDidLoad {
}
 
- (void)viewWillAppear:(BOOL)animated {
}
 
- (void)viewDidAppear:(BOOL)animated {
}
 
- (void)didReceiveMemoryWarning {
}
 
- (void)viewWillDisappear:(BOOL)animated {
}
 
- (void)viewDidDisappear:(BOOL)animated {
}
 
- (void)dealloc {
}
 
#pragma mark - Events
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark - UIOtherComponentDelegate
#pragma mark - Custom Delegates
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - Getters and Setters

UIView

AutoLayoutFrame禁止混合使用,只能选择一种方式!!!

#pragma mark - Life cycle
 
- (instancetype)init {
}
 
- (instancetype)initWithFrame:(CGRect)frame {
}
 
- (void)updateConstraints {
}
 
- (void)layoutSubviews {
}
 
+ (BOOL)requiresConstraintBasedLayout {
    return YES;
}
 
- (void)dealloc {
}
 
#pragma mark - Events
#pragma mark - UIOtherComponentDelegate
#pragma mark - Custom Delegates
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - Getters and Setters

Snippets

IF/ELSE/SWITCH/FOR/WHILE语句格式:关键字+空格+(条件)+空格+{+换行
IF语句(如果IF语句不是方法体第一行,与上面的代码之间添加一行空行,如果ELSE语句不是最后一行,与下面代码之间加一行空行)

if (condition1) {
    // Do something1
} else if (condition2) {
    // Do something2
} else {
    // Do anything
}
 
 
不推荐
if (condition) return value;
if (condition)
    return value;

SWITCH语句

switch (condition) { 
    case 1: 
        // ...
        break; 
    case 2: { 
        // ... 
        // Multi-line example using braces
        break; 
    } 
    default: 
        // ...
        break; 
}

FOR语句

for (NSObject *object in list) {
    // Do something
}
 
 
for (int i = 0; i < N; i++) {
    // Do something
}

WHILE语句

while (condition) {
    // Do something
}
 
do {
    // Do something
} while (condition)

方法命名

通用命名、属性方法命名、Delegate方法命名、集合方法命名、方法参数命名、私有方法命名

通用命名

1、使用小驼峰命名规则
2、对于表示对象采取的操作的方法,使用动词开始

- (void)invokeWithTarget:(id)target;
- (void)selectTabViewItem:(NSTabViewItem *)tabViewItem;

3、所有参数之前使用关键字

- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag; ✅
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;                    ❌

4、在参数之前创建单词描述参数

- (id)viewWithTag:(NSInteger)aTag;  ✅
- (id)taggedView:(int)aTag;         ❌

5、在创建比继承方法更具体的方法时,在现有方法的末尾添加新关键字

- (id)initWithFrame:(CGRect)frameRect;  父类
- (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide;          子类

6、不要使用“and”来链接作为接收者属性的关键字

- (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes;          ✅
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;    ❌

7、可以使用“and”来链接两个单独的操作

- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;
属性方法命名

1、名词属性格式

- (type)noun;
- (void)setNoun:(type)aNoun;
例如:
- (NSString *)title;
- (void)setTitle:(NSString *)aTitle;

2、形容词属性格式

- (BOOL)isAdjective;
- (void)setAdjective:(BOOL)flag;
例如:
- (BOOL)isEditable;
- (void)setEditable:(BOOL)flag;

3、动词属性格式(动词现代式)

- (BOOL)verbObject;
- (void)setVerbObject:(BOOL)flag;
例如:
- (BOOL)showsAlpha;
- (void)setShowsAlpha:(BOOL)flag;

4、不要使用分词将动词转换为形容词

- (void)setAcceptsGlyphInfo:(BOOL)flag;     ✅
- (BOOL)acceptsGlyphInfo;                   ✅
- (void)setGlyphInfoAccepted:(BOOL)flag;    ❌
- (BOOL)glyphInfoAccepted;                  ❌

5、可以使用情态动词(can, should, will等)来提高清晰性,但不要使用dodoes

- (void)setCanHide:(BOOL)flag;              ✅
- (BOOL)canHide;                            ✅
- (void)setShouldCloseDocument:(BOOL)flag;  ✅
- (BOOL)shouldCloseDocument;                ✅
- (void)setDoesAcceptGlyphInfo:(BOOL)flag;  ❌
- (BOOL)doesAcceptGlyphInfo;                ❌

6、只有在方法需要间接返回多个值的情况下,才使用 get

- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;
Delegate方法命名

1、用于通知委托对象操作即将发生或已经发生的方法名中要使用 didwill

- (BOOL)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;

2、用于询问委托对象可否执行某操作的方法名中可使用didwill,但最好使用 should

- (BOOL)windowShouldClose:(id)sender;
集合对象方法命名(Array、Set、Dictionary、Table等)

集合对象(集合中的对象被称之为元素), 约定要具备如下形式的方法

- (void)addElement:(elementType)anObj;
- (void)removeElement:(elementType)anObj;
- (NSArray *)elements;
例如:
- (void)addLayoutManager:(NSLayoutManager *)obj;
- (void)removeLayoutManager:(NSLayoutManager *)obj;
- (NSArray *)layoutManagers;
- (void)insertLayoutManager:(NSLayoutManager *)obj atIndex:(int)index;
- (void)removeLayoutManagerAtIndex:(int)index;
方法参数命名

1、参数采用小驼峰命名
2、不要在参数名中使用 pointerptr,让参数的类型来说明它是指针
3、避免使用 one, two,...,作为参数名
4、避免为节省几个字符而缩写

按照 Cocoa 惯例,以下关键字与参数联合使用

...action:(SEL)aSelector
...alignment:(int)mode
...atIndex:(int)index
...content:(NSRect)aRect
...doubleValue:(double)aDouble
...floatValue:(float)aFloat
...font:(NSFont *)fontObj
...frame:(NSRect)frameRect
...intValue:(int)anInt
...keyEquivalent:(NSString *)charCode
...length:(int)numBytes
...point:(NSPoint)aPoint
...stringValue:(NSString *)aString
...tag:(int)anInt
...target:(id)anObject
...title:(NSString *)aString

xcassets

1、按模块分目录,目录首字母大写,大驼峰命名

|--CreateOrder
|--DispatchOrder
|--OrderDetail 

2、图片命名格式:模块名称页面名称控件名称[_状态名称]

|--CreateOrder
|  |--createOrder_selectAddress_okButton_normal
|  |--createOrder_selectAddress_okButton_highlighted
|  |--createOrder_selectAddress_okButton_disabled
|  |--createOrder_selectAddress_okButton_selected
|  |--createOrder_selectAddress_okButton_focused

strings

1、按模块分组

// 下单模块
...
...
 
// 派单模块
...

2、文案键值对,键全大写,格式:模块名称页面名称控件名称[_状态名称]

// 下单模块
"CREATEORDER_SELECTADDRESS_OKBUTTON_NORMAL" = "完成";
"CREATEORDER_SELECTADDRESS_CANCELBUTTON_NORMAL" = "取消";
 
// 派单模块
"DISPATCHORDER_ORDERCARD_RECREATEBUTTON_NORMAL" = "重新下单";

相关文章

  • IOS基础:编码规范

    原创:知识点总结性文章创作不易,请珍惜,之后会持续更新,不断完善个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈...

  • iOS开发 | 规范编码的四个意识

    iOS开发 | 规范编码的四个意识 iOS开发 | 规范编码的四个意识

  • iOS 编码规范

    Table of Contents iOS 编码规范1 文件规范1.1 文件编码1.2 文件命名2 编码格式2.1...

  • iOS(Objective-C)编码规范

    iOS(Objective-C)编码规范 本文件旨在统一****iOS方向编码规范。增强代码可读性,便于后期维护。...

  • iOS 基础编码规范整理

    iOS 基础编码规范 目录 代码格式化空格 代码组织Pragma 命名通用的约定常量方法字面量 类类名初始化属性属...

  • 20170317 Guidelines & AppSto

    Guidelines iOS开发规范整理 Objective-C编码规范:26个方面解决iOS开发问题 iOS开发...

  • iOS 代码规范文档

    iOS 代码规范文档 [toc] 修订 概述 制定目的:制定iOS 编码规范,主要是为了规范公司内部的iOS 代码...

  • 雷铭大前端组件库

    雷铭大前端组件库 包含《雷铭前端开发规范》、《雷铭Android编码规范》、《雷铭iOS编码规范》以及不同技术分类...

  • iOS编码规范

    iOS编码规范 GitHub 地址https://github.com/CodeOuyang/iOS-note.g...

  • 2018-08-13

    浅谈iOS编码规范 命名 awakeFromNib不能拿到真实尺寸

网友评论

      本文标题:IOS基础:编码规范

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