美文网首页
iOS编码规范

iOS编码规范

作者: TigerManBoy | 来源:发表于2020-03-30 10:23 被阅读0次

常量

在常量的使用上,建议尽量使用类型常量,不要使用宏定义,不如要定义一个常量,推荐这样写:

static NSString * const STMProjectName = @"GCDFetchFeed"

而不是这样写:

#define STMProjectName @"GCDFetchFeed"

变量

1.变量名应该可以明确体现出功能,最好再加上类型做后缀。这样也就明确了每个变量都是做什么的,而不是把一个变量当作不同的值用在不同的地方。
2.在使用之前,需要先对变量做初始化,并且初始化的地方离使用它的地方越近越好。
3.不要滥用全局变量,尽量少用它来传递值,通过参数传值可以减少功能模块间的耦合。

比如,下面这段代码中,当名字为字符串时,就可以把字符串类型作为后缀加到变量名后面。


let nameString = "Tom"
print("\(nameString)")

nameLabel.text = nameString

属性

在 iOS 开发中,关于属性的编码规范,需要针对开发语言做区分:

  • Objective-C 里的属性,要尽量通过 get 方法来进行懒加载,以避免无用的内存占用和多余的计算。
  • Swift 的计算属性如果是只读,可以省掉 get 子句。示例代码如下:

var rectangleArea: Double {
  return long * wide
}

条件语句

在条件语句中,需要考虑到条件语句中可能涉及的所有分支条件,对于每个分支条件都需要考虑到,并进行处理,减少或不使用默认处理。特别是使用 Switch 处理枚举时,不要有 default 分支。

在 iOS 开发中,你使用 Swift 语言编写 Switch 语句时,如果不加 default 分支的话,当枚举有新增值时,编译器会提醒你增加分支处理。这样,就可以有效避免分支漏处理的情况。

另外,条件语句的嵌套分支不宜过多,可以充分利用 Swift 中的 guard 语法。比如,这一段处理登录的示例代码:


if let userName = login.userNameOK {
    if let password = login.passwordOK {
        // 登录处理
        ...
    } else {
        fatalError("login wrong")
    }
} else {
    fatalError("login wrong")
}

上面这段代码表示的是,当用户名和密码都没有问题时再进行登录处理。那么,我们使用 guard 语法时,可以改写如下:


guard 
  let userName = login.userNameOK,
  let password = login.passwordOK,
  else {
    fatalError("login wrong")
}
// 登录处理
...

可以看到,改写后的代码更易读了,异常处理都在一个区域,guard 语句真正起到了守卫的职责。而且你一旦声明了 guard,编译器就会强制你去处理异常,否则就会报错。异常处理越完善,代码就会越健壮。所以,条件语句的嵌套处理,你可以考虑使用 guard 语法。

循环语句

在循环语句中,我们应该尽量少地使用 continue 和 break,同样可以使用 guard 语法来解决这个问题。解决方法是:所有需要 continue 和 break 的地方统一使用 guard 去处理,将所有异常都放到一处。这样做的好处是,在维护的时候方便逻辑阅读,使得代码更加易读和易于理解。

函数

对于函数来说,体积不宜过大,最好控制在百行代码以内。如果函数内部逻辑多,我们可以将复杂逻辑分解成多个小逻辑,并将每个小逻辑提取出来作为一个单独的函数。每个函数处理最小单位的逻辑,然后一层一层往上组合。这样,我们就可以通过函数名明确那段逻辑处理的目的,提高代码的可读性。

拆分成多个逻辑简单的函数后,我们需要注意的是,要对函数的入参进行验证,guard 语法同样适用于检查入参。比如下面的这个函数:


func saveRSS(rss: RSS?, store: Store?) {
    guard let rss = rss else {
        return 
    }
    guard let store = store else {
        return
    }

    // 保存 RSS
    return
}

如上面代码所示,通过 guard 语法检查入参 rss 和 store 是否异常,提高函数的健壮性会来得更容易些。

另外,函数内尽量避免使用全局变量来传递数据,使用参数或者局部变量传递数据能够减少函数对外部的依赖,减少耦合,提高函数的独立性,提高单元测试的准确性。

在 Objective-C 中,类的头文件应该尽可能少地引入其他类的头文件。你可以通过 class 关键字来声明,然后在实现文件里引入需要的其他类的头文件。

对于继承和遵循协议的情况,无法避免引入其他类的头文件,所以你在代码设计时还是要尽量减少继承,特别是继承关系太多时不利于代码的维护和修改,比如说修改父类时还需要考虑对所有子类的影响,如果评估不全,影响就难以控制。

分类

在写分类时,分类里增加的方法名要尽量加上前缀,而如果是系统自带类的分类的话,方法名就一定要加上前缀,来避免方法名重复的问题。

分类的作用如其名,就是对类做分类用的,所以我建议你,能够把一个类里的公共方法放到不同的分类里,便于管理维护。分类特别适合多人负责同一个类时,根据不同分类来进行各自不同功能的代码维护。

推荐:

Spotify 的 Objective-C 编码规范:https://github.com/spotify/ios-style
纽约时报的 Objective-C 的编码规范:https://github.com/NYTimes/objective-c-style-guide
Raywenderlich 的 Objective-C 编码规范:https://github.com/raywenderlich/objective-c-style-guide
Raywenderlich 的 Swift 编码规范:https://github.com/raywenderlich/swift-style-guide

相关文章

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

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

  • iOS 编码规范

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

  • iOS(Objective-C)编码规范

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

  • 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编码规范

    目录 核心原则 命名 文件命名 视图命名 方法命名 变量命名 图片命名 代码格式 空格 函数的书写 函数调用 协议...

  • iOS 编码规范

    约定 在我看来,开发规范像是一条可供参考的标准线。不同开发者可以根据这条标准线来规范自己的开发行为,尤其是在大的项...

网友评论

      本文标题:iOS编码规范

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