前言
在网上找到了一些书写iOS代码时的规范,也加了一些自己平时书写代码的习惯,希望对程序员同胞有所帮助.
原则
- 如果对应目录下有多个相关的类,则controller,view,model的名字相应变为controllers,views,models
- Images.xcassets中的目录结构要与业务保持一致,从而方便查找和替换图片
- 注释可以采用“/* */“和“//“两种注释符号,涉及到多行注释时,尽量使用“ /* */“
- 对于一行代码的注释可放在前一行及本行上,不允许放在下一行,更不允许在一行语句的中间加入注释
-
不必每行都加注释,在3~10行左右的段落做注释要好于每行都做注释,显而易见的代码不加注释
排版格式
- 代码的缩进应使用空格(SPACE),不能使用制表符(TAB),并且缩进以2个字符为单位
-
括弧遵循紧凑编码方式
-
空格的使用
-
关键字与其后的表达式之间要有空格
- 单目操作符不应与它们的操作数分开(如“!“和“^“等)
-
除“,“外,其它双目操作符应与它们的操作数用空格隔开
- .h中协议<>前面有一个空格
- .h中成员声明时,类型与变量之间有至少1个空格。*号靠近变量,不靠近类型
- @property后留1个空格,()里面,逗号紧跟前一变量,与后一变量之间留1个空格。()外面,先留1个空格,再声明属性
- 方法的+,-后面与()之间留1个空格
- 返回类型与之间留1个空格,方法参数中返回类型与之间留1个空格
- 在多参数方法中,每个参数后面都有1个空格
文件命名规范
- 目录的名字采用第一个单词首字母小写,其他单词首字母大写的格式,如:contactList、controller
- 目录主要用来对业务做区分,所以目录的名字要有意义。如:
contactList:代表这是联系人列表的业务
controller:代表这是MVC的控制部分
资源文件的名字采用第一个单词首字母小写,其他单词首字母大写的格式,最后以文件类型结尾
代码命名规范
-
方法的名称应全部使用有意义的单词组成,且以小写字母开头,多单词组合时,后面的单词首字母大写
-
设置类变量的内容的方法应使用set作为前缀,读取变量的内容的方法应使用get作为前缀
-
方法中的参数:第一个参数名称要从函数名称上携带出来,第二个参数的首字母小写,多个单词组合时,后面单词首字母大写。参数有别名时,参数别名与参数名一致,但参数名前缀以_。参数别名与前一参数保留1个空格。参数无别名时,以有意义的字母命名
变量
-
变量必须起有意义的名字,使其他组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,第一个单词首字母小写,其他单词首字母大写
-
对于一些特殊类型的变量,命名时要带上类型,如NSArray 的变量命名为xxxArray,其他的如xxxDictionary,xxxSize等。这样就可以从名称上知道是什么类型的变量。千万不能将NSArray的变量命名为xxxDictionary。
-
对于要和interface builder关联的的输出口变量,命名时要后缀以特定的控件名
架构规范
- 遵循严格的MVC结构设计。
- 强化View层和Model层的功能,Control层只做调度:
- 界面展示逻辑完全在View层控制,Control层通过View层提供的一个接口来将数据传递给View层,然后由View层来做具体的界面展示控制。
- 数据的加工在Model层实现,Model层通过重写setter或getter来对数据进行加工。
- Control层负责响应事件和回调,然后发送网络请求等。
- 禁止出现功能不明确的类。类必须和具体业务对应
类设计
-
UIViewController中尽量不要出现直接设置控件(UIButton,UITextField等)属性的代码,而是将控件封装在单独的自定义UIView类中,然后在自定义UIView类中设置控件的属性
- 封装私有
initContent
和updateContent
方法,前者在viewDidLoad中调用,用来初始化所有的自定义UIView,后者在viewWillAppear中调用,用来更新所有的自定义UIView。 - 所有的生命周期方法都必须调用super方法
UIView
- 为每个自定义UIView建立xib(xib和UIView类关联的方式见DEMO),静态的约束在xib中直接添加,动态的约束使用Masonry在代码中添加。
- 尽量使用Autolayout做界面约束,只有在Autolayout不支持的情况下才使用设置frame的方法来做界面约束。
- 展示的逻辑在UIView内部控制,如果UIView中某几个控件的控制逻辑比较复杂,则需要封装单独的处理方法
Category
- Category的命名要明确且跟具体的业务相关
- 能不用Category实现的功能就不用Category实现
- Portocol的命名要明确且跟具体的业务相关
-
如果Portocol实现的方法不超过3个,可以直接定义在协议相关的类中