- 命名
- 缩写单词,不在首位的时候,要全部大写
- 避免引起歧义
- 没有点击功能的cell,不要用navigation
- 命名一般不用block,因为它一般指闭包
- 不要使用ki等命名
- 回调闭包命名,要体现触发时机
- 变量名要有意义、完整
- 通知命名:体现出所在类
- “验证XXX”命名为“validateXXX”
- struct、class、enum的首字母大写,变量、方法的首字母小写
- 单测的命名仍然用驼峰命名法
- NetworkConstants 里一般不写 URL
- 格式
- 代码过长,可以手动折行
- 运算符前后要加空格
- 闭包的参数和返回值放在 { 后面
- import 和 class 之间要有空行
- 点击事件,一般用extension单独拉出来,放在setup下面
- snapkit布局时,一条约束占一行
- “()”之间有多行时,“)”放在单独一行
- 增加多个协议时,把每个协议写在单独的extension中
- if都尽量加上else
- 变量和方法之间加上空行
- 参数过多、过长,可把每个参数放一行
- 多个元素的字典,把
[
和]
单独放在一行
- map代替for-in
- 从数组中删除元素时,一次把需要删除的删除掉
- 分割线:
- SeparatorCollectionViewLayout
- separatorView
- viewModel负责数据的处理
- 布局不要放在bindData
- 不建议使用equalToSuperview
- 不同的cell,配置不同时,可在bingData中处理
- 对cell的布局,一般把字视图添加到contentView中
- 线上不需要的代码,可用#if DEBUG包裹
- 外部不需要的属性,加上private
- rx也可以监听初始化时的赋值
- 随机数:Int.random
- 不可能走到的分支,可用assertionFailure()
- 字符串数组拼接成一个字符串:joined()
- 一般不使用lazy,可以把初始化方法,放在setupSubviews中
- 相对于safeArea布局:view.safeAreaLayoutGuide
- 通知的移除,在dealloc中
- 慎用字符的
.isXXX
方法 - 对view配置完成之后在添加到父视图中,最后在布局
- 如果方法没有用到self,应该写成static
- 时间戳以毫秒为单位
- 调用构造器时不需要写init
- 避免使用强制解包“!”
- 不要手动控制视图中的文本个数,设好约束会自动控制
- navigationBar中的按钮时buttonItem,不是button
- tableView和collectionView中的cell配置,不需要加indexPath的越界判断
- 界面一般都定义为let
- 判断是否拖拽出边界:用contentOffset、contentSize 和 frame 三者进行判断
- switch中case覆盖全部情况时,不需要写default
- init的参数可以不传frame参数,调用父类的init时,可以使用.zero
- 基本数据类型,都遵循Codable协议,不需要手动实现encode和decode
- 点击时cell高亮:
- tableView:重写touchesBegan、touchesEnded、touchesCancelled方法,设置view的背景色
- collectionView:设置cell的selectedBackgroundView属性
- 写单测时,用 XCTAssertEqual 会比XCTAssert得到更好的报错信息。
- 避免不稳定的测试:生成随机数等
- 增加table的key时,要加上预期上线的版本号
- 不会被继承的类(VC)加上final
- 不要在struct中添加业务逻辑,可在实例化时指定参数(数学有某属性,语文没有,此时在语文实例化时指定其为false或者nil即可)
- oc中获取数组第一个元素可用firstObject代替[0]