目录
- 工程结构
- 模块代码结构
- 代码书写规范
一、工程结构
当前swift项目工程还在整合中,这里以旧项目结构进行展示,原理是一样的。
结构图如下:
备注:
项目工程要分层,上面结构不是一成不变;可以根据需求进行扩展,但是一定要分层,方便后续代码管理以及功能优化。
二、模块代码结构
参照OC的MVVM
设计模式,这里的swift也采用MVVM
。当前工程的登陆
和设备列表
界面已经采用这种模式。
结构如下:
备注:
为了方便代码管理,上面文件摆放顺序要一致:Controller➡️View➡️ViewModel➡️Model
特别注意:
如果Controller或View或ViewModel或Model中包含内容过多,里面必须建相应的子文件进行说明:
三、代码书写规范
3.1、代码组织
- 常量----------------------------控制器中不要出现魔鬼数字/硬编码
- Life Cycle --------------------生命周期方法
- Event Response------------事件响应方法
- Public Methods-------------公有方法
- Private Methods------------私有方法
- lazy Methods---------------懒加载方法
- CustomDelegate-----------自定义代理
- SystemDelegate-----------系统代理
在代码中的体现如下:
//---------常量区域----------------
class SPCHomeViewController: BaseViewController {
//-----------属性-------------
//-----------Life Cycle----------
//-----------Event Response----------
//-----------Public Methods --------
//-----------Private Methods --------
//-----------lazy Methods ----------
}
//---------------CustomDelegate----------
//---------------SystemDelegate---------
备注:
为了方便代码管理、上述需要严格划分。
3.2、类、函数等,左大括号不另一起行,并且跟前面留有空格
Good
func myFunc() {
}
class MyClass() {
}
Bad
func myFunc()
{
}
3.3、函数、类中间要空一行
Good
func myFunc1() {
}
func myFunc2() {
}
class MyClass1 {
}
Bad
func myFunc1() {
}
func myFunc2() {
}
class MyClass1 {
}
3.4、二元运算符,前后都要有空格
Good
let i = 5 + 6
let r = i % 10
Bad
let i=5+6
let r=i%10
3.5、区间运算符两边也要有空格
Good
let range = 1 ..< 10
Bad
let range = 1..<10
3.6、逗号后面跟空格
Good
let arr = [1, 2, 3, 4]
Bad
let arr = [1,2,3,4]
3.7、类继承、参数名和类型之间等,冒号前面不加空格,但后面跟空格
Good
class MyClass: NSObject {
}
func myFunc(value: Int) {
}
Bad
class MyClass : NSObject {
}
func myFunc(value:Int) {
}
3.8、if后面的else,跟着上一个if的右括号
Good
if flag {
// code
} else {
// code
}
Bad
if flag
{
// code
}
else
{
// code
}
3.9、switch中,case跟switch左对齐
Good
switch value {
case 1:
// code
case 2:
// code
default:
// code
}
Bad
switch value {
case 1:
// code
case 2:
// code
default:
// code
}
3.10、函数体长度不超过150行
3.11、单类体长度不超过300行
3.12、控制器长度不要超过800行
3.13、实现每个协议时,在单独的extension里来实现
Good
class MyViewController: UIViewController {
}
extension MyViewController: UITableViewDataSource {
}
extension MyViewController: UIScrollViewDelegate {
}
Bad
class MyViewController: UIViewController, UITableViewDataSource, UIScrollViewDelegate {
}
3.14、简单闭包,写在同一行
Good
let r = arr.filter { $0 % 2 == 0 }
Bad
let r = arr.filter {
$0 % 2 == 0
}
3.15、优先使用let定义变量,而不是var
3.16、异常的分支,提前用guard结束。
Good
func process(value: Int) {
guard value > 0 else {
return
}
// code
}
Bad
func process(value: Int) {
if value > 0 {
// code
}
}
3.17、尽可能使用private、fileprivate来限制作用域
Good
class MyClass {
private func util() { // 仅在类内部使用
}
}
Bad
class MyClass {
func util() { // 仅在类内部使用
}
}
3.18、不使用强制解包
Good
if let value = optional {
// code
}
Bad
let value = optional!
3.19、不使用强制类型转换
Good
if let r = value as? String {
// code
}
Bad
let r = value as! String