iOS编码规范

一、文件目录

项目基本目录结构如下,针对项目不同,可略作差异处理:

1.Views

存放界面层UIViewController和自定义的UIView,如项目有iPhone和iPad区分适配要求,又可细分为iPhone目录和iPad目录。

文件夹名按项目业务名进行划分,例如:
- MainView
- UserView
- DigitalView

2.Tools

存放轻量级第三方组件、自定义组件、自定义类扩展。不包含cocoapod可导入的工具包,引用第三方库的时候要谨慎,避免使用大容量的第三方库,而导致客户端非常大

组件如:
- 日期时间处理工具 DateTool
- 弹出加载HUD处理 InfoTool
- 下拉刷新代码图片 UpdownRefresh
- 时间选择器 UWDatePicker

扩展如:
- 弹出框Block返回  UIAlert+Blocks
- WebView用于加载Block模式  UIWebView+Blocks

3.Network

存放网络请求框架和json模型。对应项目请求数据,可对模型层进行修改。

基于目前项目应用MVC框架结构,具体文件内容如下:

网络请求:
- 请求方法处理 NetManager(AFNetWork相关代码)
- 请求数据处理 NetManagerMessage(数据处理相关代码和KVO消息广播)

模型文件:
- 用户信息模型  UserDetailObject:userID userName userPicture 

4.Supporting Files

存放配置文件和storyboard文件,包括:

Info.plist
ProjectName.pch
main.m
Main.storyboard
LaunchScreen.storyboard
ApiKey.h

5.Assets.xcassets

存放项目下图片信息,需按项目模块分类大体与View文件夹中对应。Nav菜单和Toolbar菜单中,贯穿整体使用的图片,需单独放置。

二、命名规则

1、注意事项

  • 项目编码格式统一采用UTF-8编码
  • 代码中除注释外禁止出现中文(在xml等资源文件中)
  • 代码中禁止出现警告提示痕迹 例如:#Warning

2、可使用的缩写

除以下列举的缩写格式,每个项目开始前应进行分析,针对特殊命名进行文档编写

缩写 全称
bg background
vc viewcontroller
btn button
nav navgation

3、命名基本原则

  • 在面向对象编程中,对于类,对象,方法,变量等方面的命名应该本着描述性以及唯一标识性这两大特征来命名,才能保证资源之间不冲突,并且每一个都便于记忆。

  • 命名原则是:使名称足够长以便有一定的意义,并且足够短以避免冗长。

4、一般性原则:

  • 可读性高(简洁且清晰)和防止命名冲突(通过加前缀后缀来保证)
  • Objective-C 的命名通常都比较长, 名称遵循驼峰式命名法.
  • 方法名要指明具体用途,让开发者能一目了然,清晰表达要插入什么?删除什么?具体位置是指?
方法名合理 不合理 原因
insertObject:atIndex: insert:at: 插入什么?at是指?
removeObjectAtIndex: remove: 删除什么?
  • 尽可能保持与cocoa命名规则一致
代码 原因
– (NSInteger)tag 在 NSView, NSCell, NSControl 中有定义
– (void)setStringValue:(NSString *) 在许多 Cocoa classes 中都有定义

5、文件的命名:

  • 分类的文件名应该包含被扩展的类名,如NSString+HooUtils.h
  • 文件名不要使用缩写

6、类的命名:

类名(以及类别、协议名)应首字母大写,并以驼峰格式分割单词。

a.类的前缀
  • 所有类名、枚举、结构、protocol定义时最好加一个统一的标示符,可以是项目缩写,或者个人项目的名称缩写,例如都加上全大写的Hoo(我的姓氏)作为前缀
  • 根据功能模块可以在给功能模块的类添加功能模块的名称前缀,如用户中心的profileViewController.可以命名为HooUCProfileViewController.
b.类的后缀
  • 所有protocol定义时,都加上后缀Delegate 。如,HooRefreshViewDelegate,表示RefreshView的协议;
  • 所有的控制器都加上Controller,所有的通知名都加上Notification。

7、类别命名

  • 类名+标识+扩展(UIImageView +HP+Web)

    如果我们想要创建一个基于UIImageView 的类别用于网络请求图片,我们应该把类别放到名字是UIImageView+HPWeb.h的文件里。UIImageView为要扩展的类名,HP为专属标识,Web为扩展的功能。

8、方法命名

方法名应遵守小驼峰原则,首字母小写,其他单词首字母大写,每个空格分割的名称以动词开头。执行性的方法应该以动词开头,小写字母开头,返回性的方法应该以返回的内容开头,但之前不要加get。如:

- (void)insertModel:(id)model atIndex:(NSUInteger)atIndex;

- (instancetype)arrayWithArray:(NSArray *)array;
a.代理方法

以发送代理的对象类名作为代理方法名的开始(去掉类名的前缀,并且小写开头)

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

9、枚举的命名

正宗的iOS开发者当然要以Objective-C的方式命名枚举,如:

  typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};

10、属性、变量命名

变量名使用小驼峰法, 使变量名尽量可以推测其用途属性具有描述性。别一心想着少打几个字母,让你的代码可以迅速被理解更加重要。每个属性命名都加上类型后缀,如,按钮就加上Button
后缀,模型就加上Model后缀。

@property (nonatomic, strong) UIButton *submitButton;
a.类成员变量名

成员变量用小驼峰法命名并前缀下划线,如:

UIButton *_submitButton;
b.局部变量名

遵守小驼峰命名规则,如:

NSInteger numCompletedConnections =3;

const常量
以小写k
开头,后面单词首字母大写,其余小写。如:

const float kMaxHeigt = 100.0f;

如果是特殊含义的常量也建议加上后缀,如通知加上Notification为后缀,如:

extern Nsstring * Const kLoginSuccessNotification

11、资源文件命名 (图片,本地化文件)

这个图片资源命名方式,以功能为组织形式,是一个很好的习惯,有利于查看资源文件。

采用单词全拼,或者大家公认无岐义的缩写(比如:nav,bg,btn等)

“模块+功能”命名法。

模块分为公共模块、私有模块。公共模块主要包括统一的背景,导航条,标签,公共的按钮背景,公共的默认图等等;私有模块主要根据app的业务功能模块划分,比如用户中心,消息中心等。
例如用户中心用户头像图片的命名可以为:uc_imageview_user_icon

三、注释原则

方法注释

对于方法的注释,尽可能保留在声明文件中。

当它需要的时候,注释应该用来解释特定的代码做了什么。所有的注释必须被持续维护或者干脆就删掉,不要做多余注释,应维持简洁

块注释应该被避免,代码本身应该尽可能就像文档一样表示意图,只需要很少的打断注释。 例外: 这不能适用于用来产生文档的注释

头文档

一个类的文档应该只在 .h 文件里用 Doxygen/AppleDoc 的语法书写。 方法和属性都应该提供文档。

/**
*  Designated initializer.
*
*  @param  store  The store for CRUD operations.
*  @param  searchService The search service used to query the store.
*
*  @return A ZOCCRUDOperationsStore object.
*/
- (instancetype)initWithOperationsStore:(id<ZOCGenericStoreProtocol>)store
                      searchService:(id<ZOCGenericSearchServiceProtocol>)searchService;

类结构布局

使用#pragma mark –来分类方法

#pragma mark – Life Cycle

#pragma mark - Events

#pragma mark – Private Methods

#pragma mark - UITextFieldDelegate

#pragma mark - UITableViewDataSource

#pragma mark - UITableViewDelegate

#pragma mark - Custom Delegates

#pragma mark – Getters and Setters

四、编码原则

  • 服务端可以实现的,就不要放在客户端来实现
  • 如果多个ViewController中包含共同的UI处理,那么可以提炼一个CommonViewController,把通用部分叫由它来处理,其他ViewController只要继承它即可
  • 数据一定要校验,例如,字符型转数字型,如果转换失败一定要有缺省值;服务端响应数据是否有效判断
  • 图片需针对分辨率处理,图片过大(超过200MB)需要压缩
  • 不要重用父类的handler,对应一个类的handler也不应该让其子类用到
  • 每个ViewController都有自己独立的消息处理,其中包括正确的消息处理,错误处理,异常捕捉

2)采用“模块+功能”命名法,模块分为公共模块、私有模块。公共模块主要包括统一的背景,导航条,标签,公共的按钮背景,公共的默认图等等;私有模块主要根据app的业务功能模块划分,比如用户中心,消息中心等。
例如用户中心用户头像图片的命名可以为:uc_imageview_user_icon

感谢jackiehoo(简书作者)
部分参考来自于:http://www.jianshu.com/p/c598d32560e8
http://www.jianshu.com/p/1aa8b9bb4576
以及
Google 开源项目风格指南



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

推荐阅读更多精彩内容

  • 注释规范 文件头注释 文件头注释采用如下格式,该注释由xcode自动生成。如果你对其他人的原始代码作出重大的修改,...
    yangzming阅读 724评论 0 1
  • 命名 Bundle id命名: 规则:采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名根据应用进行...
    Tippi阅读 1,620评论 0 2
  • Object-C 开发代码规范概要Object-C是一门面向对象的动态编程语言,主要用于编写IOS和MAC应用程序...
    克鲁德李阅读 530评论 0 1
  • 面试被问到公司编码规范问题,感觉有很多东西,但是不知道该怎么说出来,今天突然找到 李明杰 老师的一份编码规范。重新...
    Dombo_Y阅读 958评论 1 2
  • 1. 给每个配置文件加上描述 最好使用descriptive id和名称来代替在XML配置文件中的注释。此外,加上...
    野梦M阅读 528评论 0 1