iOS开发规范汇总(一)

语言: CN / TW / HK

命名规范

驼峰法

大驼峰

文件名、class、struct、enum、protocol 名称首字母大写,即大驼峰,例如:

UIViewController RCView RCHandler

小驼峰:

命名变量、方法、参数、swift枚举成员时,第一个单词的首字母应当小写,即小驼峰,例如:

swift myRefreshControl、 infoArray、 numberOfCellInSectionArray、 viewDidLoad

其他

Swift方法命名的一些细节

```swift // at 表示在哪里,语义更加清晰 func add(_ anItem: Any,at index: Int) {

} ``` 命名中出现英文缩写例如JSON、URL、ID,要么用全部大写,要么用全部小写

swift class IDUtil {} func idToString(){ }

协议命名

根据苹果接口设计指导准则, 1. 协议名称用来描述一些东西是什么的时候是名词,例如:Collection、WidgetFactory。 2. 若协议名称用来描述能力应该以-ing, -able, 或 -ible结尾,例如:Equatable、Resizing。 3. 在定义delegate方法时第一个未命名的参数应该是被代理的对象,例如常见的

```js func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { ... }

``` Foundation和UIKit中的的各种命名都是最标准的苹果规范,我们都可以拿来做参考。

宏定义 VS 全局静态常量

宏定义比较方便用来条件编译,但是也有一些弊端: 1. 宏定义会在编译期间挨个做替换,在比较多的地方使用会导致编译速度变慢,所以如果在全局都使用一个值的话,可以考虑使用全局静态常量来替代宏定义。 2. 宏定义是直接替换有时候会有坑,如果是表达式尽量加上括号

宏定义: ```objective-c

define kScaleSpace 30 // OC风格:首字母用k,第二个字母大写,后面遵循驼峰

define SCALE_SPACE 30 // C语言风格,所有字母大写,单词用下划线分割

endif

// 状态检查 #define MJRefreshCheckState \ MJRefreshState oldState = self.state; \ if (state == oldState) return; \ [super setState:state];

// 异步主线程执行,不强持有Self #define MJRefreshDispatchAsyncOnMainQueue(x) \ __weak typeof(self) weakSelf = self; \ dispatch_async(dispatch_get_main_queue(), ^{ \ typeof(weakSelf) self = weakSelf; \ {x} \ });

```

条件编译举例:debug环境日志打印,release环境屏蔽日志 ```js

ifdef DEBUG

// 调试状态, 打开LOG功能
#define ZHLog( s, ... ) NSLog( @"[%@:(%d)] %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )

else

// 发布状态, 关闭LOG功能
#define ZHLog(format, ...)

endif

``` weak strong dance问题解决 之宏定义 weakify strongify

```js

ifndef WeakStrongDefine_h

define WeakStrongDefine_h

//1. 测试且 ARC 环境

ifndef weakify

define weakify(object) autoreleasepool {} weak __typeof(object) object####weak = object;

endif

ifndef strongify

define strongify(object) autoreleasepool {} typeof(object) object = object####weak;

endif

//2. 正式且 ARC 环境

ifndef weakify

define weakify(object) try {} @catch (...){} weak __typeof(object) object####weak = object;

endif

ifndef strongify

define strongify(object) try {} @catch (...){} typeof(object) object = object####weak;

endif

//3. 测试且非 ARC 环境

ifndef weakify

define weakify(object) autoreleasepool {} block __typeof(object) object####block = object;

endif

ifndef strongify

define strongify(object) autoreleasepool {} typeof(object) object = object####block;

endif

//4. 正式且非 ARC 环境

ifndef weakify

define weakify(object) try {} @catch (...){} block __typeof(object) object####block = object;

endif

ifndef strongify

define strongify(object) try {} @catch (...){} typeof(object) object = object####block;

endif

endif / WeakStrongDefine_h /

//使用举例

@weakify(self) self.someBlock = ^(){ @strongify(self) [self doSomething]; } ```

全局静态常量举例:

objective-c static const NSString* kXXAppCommonBaseURL = @"http://www.baidu.com"; //logo宽度 static const NSString* kXXAppWeiXinKey = "asdfasdfasdrewwdfasdf"; static CGFloat const kXXAppContainerHeight = 230;

注释

文件注释

采用Xcode自动生成的注释格式,修改部分参数

其中项目名称创建人公司/组织版权需要填写正确。 最下面建议写上文件中代码的用途

```js //

//  ZHHomeViewController.m

//  ZHPractiseApp

//

//  Created by mardolf on 2021/11/3.

//  Copyright © 2021 马尔道夫. All rights reserved.

// 页面-首页 ```

方法注释

Xcode中自带文档标准注释方法 option + command + /

js /// 方法功能描述 /// @param tableView <#tableView description#> /// @param section <#section description#> /// @return section <#section description#> -(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ ... }

普通注释

js // 这是单行注释 /*这是多行注释*/

TODO注释

// TODO: 待办事项

代码结构标记

```objective-c // Objective-C版

paragma mark - life cycle

...生命周期函数代码...

paragma mark - XXDelegate & XXDatasource

...XX代理实现... 一些方法 ```

```swift // Swift版 // MARK: - life cycle

// MARK: - XXDelegate & XXDatasource ```

日期格式化细节

js 使用YYYY-MM-DD - `YYYY`使用的是`当前周所在的年份(Week of Year)` 使用yyyy-MM-DD - `yyyy`使用的是`日历年`,我们应该使用`日历年`这种方式 大部分情况下两者得到的格式化字符串是相同的,但是,如果遇到跨年的周,例如2021-12-30日 在使用YYYY格式的情况下打印出来就是 2022-12-30,这就不对了,差了一年。

判断字符串是否为空

oc直接使用 lenth 是否为0

swift 由于算法效率问题官方不建议使用.count,而是使用 isEmpty

swift var str = "" //判断空值 if str.isEmpty { } //判断非空 if str.isEmpty == false { }

标点符号

  1. 判断语句中 if后面的条件不需要使用括号"()"
  2. 一行代码不需要使用分号";"结尾