命名规范
驼峰法
大驼峰
文件名、class、struct、enum、protocol 名称首字母大写,即大驼峰,例如:
UIViewController
RCView
RCHandler
复制代码
小驼峰:
命名变量、方法、参数、swift枚举成员时,第一个单词的首字母应当小写,即小驼峰,例如:
myRefreshControl、
infoArray、
numberOfCellInSectionArray、
viewDidLoad
复制代码
其他
Swift方法命名的一些细节
// at 表示在哪里,语义更加清晰
func add(_ anItem: Any,at index: Int) {
}
复制代码
命名中出现英文缩写例如JSON、URL、ID,要么用全部大写,要么用全部小写
class IDUtil {}
func idToString(){
}
复制代码
协议命名
根据苹果接口设计指导准则,
- 协议名称用来描述一些东西是什么的时候是名词,例如:Collection、WidgetFactory。
- 若协议名称用来描述能力应该以-ing, -able, 或 -ible结尾,例如:Equatable、Resizing。
- 在定义delegate方法时第一个未命名的参数应该是被代理的对象,例如常见的
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
}
复制代码
Foundation和UIKit中的的各种命名都是最标准的苹果规范,我们都可以拿来做参考。
宏定义 VS 全局静态常量
宏定义比较方便用来条件编译,但是也有一些弊端:
- 宏定义会在编译期间挨个做替换,在比较多的地方使用会导致编译速度变慢,所以如果在全局都使用一个值的话,可以考虑使用全局静态常量来替代宏定义。
- 宏定义是直接替换有时候会有坑,如果是表达式尽量加上括号
宏定义:
#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环境屏蔽日志
#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
#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];
}
复制代码
全局静态常量举例:
static const NSString* kXXAppCommonBaseURL = @"https://www.baidu.com"; //logo宽度
static const NSString* kXXAppWeiXinKey = "asdfasdfasdrewwdfasdf";
static CGFloat const kXXAppContainerHeight = 230;
复制代码
注释
文件注释
采用Xcode自动生成的注释格式,修改部分参数
其中项目名称、创建人、公司/组织版权需要填写正确。 最下面建议写上文件中代码的用途
//
// ZHHomeViewController.m
// ZHPractiseApp
//
// Created by mardolf on 2021/11/3.
// Copyright © 2021 马尔道夫. All rights reserved.
// 页面-首页
复制代码
方法注释
Xcode中自带文档标准注释方法 option + command + /
/// 方法功能描述
/// @param tableView <#tableView description#>
/// @param section <#section description#>
/// @return section <#section description#>
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
...
}
复制代码
普通注释
// 这是单行注释
/*这是多行注释*/
复制代码
TODO注释
// TODO: 待办事项
代码结构标记
// Objective-C版
#paragma mark - life cycle
...生命周期函数代码...
#paragma mark - XXDelegate & XXDatasource
...XX代理实现...
** 一些方法 **
复制代码
// Swift版
// MARK: - life cycle
// MARK: - XXDelegate & XXDatasource
复制代码
日期格式化细节
使用YYYY-MM-DD
- `YYYY`使用的是`当前周所在的年份(Week of Year)`
使用yyyy-MM-DD
- `yyyy`使用的是`日历年`,我们应该使用`日历年`这种方式
复制代码
大部分情况下两者得到的格式化字符串是相同的,但是,如果遇到跨年的周,例如2021-12-30日 在使用YYYY格式的情况下打印出来就是 2022-12-30,这就不对了,差了一年。
判断字符串是否为空
oc直接使用 lenth 是否为0
swift 由于算法效率问题官方不建议使用.count,而是使用 isEmpty
var str = ""
//判断空值
if str.isEmpty {
}
//判断非空
if str.isEmpty == false {
}
复制代码
标点符号
- 判断语句中 if后面的条件不需要使用括号"()"
- 一行代码不需要使用分号";"结尾