1.头文件#import的顺序
写法模板
#import <系统库>
#import <第三方库>
#import “其他类”
建议的写法
#import <UIKit/UIKit.h>
#import <Google/Analytics.h>
#import "GBOrderEmptyView.h"
不建议的写法
#import <UIKit/UIKit.h>
#import <Google/Analytics.h>
#import "GBOrderEmptyView.h"
2.@Class的写法
写法模板:@class class1,class2;
建议的写法:
@class UIView,UIImage;
不建议的写法
@class UIPress;
@class UIPressesEvent;
3.@Interface的写法
@interface 类名 : 父类 <协议1,2="">
@interface和类名中间一个空格
类名后紧跟: 之后空格加上父类协议之间用,空格分割
建议的写法
@interface AppDelegate : UIResponder <UIApplicationDelegate, UITableViewDataSOurce>
不建议的写法
@interface AppDelegate:UIResponder <UIApplicationDelegate,UITableViewDataSOurce>
4.@protocol的写法
写法的模板
@protocol 协议名称 <协议1,协议2="">
@protocol和协议的名称有空格 协议的名称和其他协议有空格 其他协议之间有空格
建议的写法
@protocol UIResponderStandarEditActions <NSObject>
不建议的写法
@protocol UIResponderStandarEditActions<NSObject>
5.@property的写法
@property (关键词, 关键词) 类 *变量名称;
关键词用,空格分割 类前后空格
正确的写法
@property (strong, noatomic) UIWindow *window;
不建议的写法
@property (strong, noatomic) UIWindow * window;
6.h头文件方法写法
写法模板
@interface
方法的参数在一排显示
方法之间保留一行
第一个方法和@interface保留空行
最后一个方法和@end保留空行
建议的写法
@interface Text : NSObject
- (void)testFunction;
@end
错误的写法
@interface Text : NSObject
- (void)testFunction;
@end
7.声明const的字符串
开头用k标识
推荐k+模板名字首字母大写+作用名称 防止和其他的重复
比如:CartViewModel类需要声明更新购物车列表的通知
kCVMNoticationUpdateCartList
如果是声明Cell的重用字符
k+cell的名称+identifier
比如: GBHomeItemTableViewCell的标识符
kGBHomeItemTableViewCellIdentifier
Const声明字符串位置
如果是需要声明在h里面让其他的类用到需要在h声明m实现
声明
UIKIT_EXTERN NSString *const kNoticationUpdateCartList;
实现
NSString *const kNoticationUpdateCartList = @"kNoticationUpdateCartList";
对于如果导入是UIKit类就使用UIKIT_EXTERN?如果是Founction使用关键词FOUNDATION_EXTERN
如果只在本类使用只用写实现 不用写声明。
8.pragma mark的使用
对于属性的不同作用 比如设置颜色的 设置字体的 设置其他样式 的可以进行分组
对于方法的作用分类 比如添加功能 删除功能的
对于其他的代理方法 Get Set方法 Init初始化方法
建议的写法
#pragma mark - Init
#pragma mark - Request
#pragma mark - Delegate
#pragma mark - DataSource
#pragma mark - Setter
#pragma mark - Getter
9.BOOL类型属性的声明
属性set不要带is get要带is
建议写法
@property(noatomic, assign, getter=isUserLogin) BOOL userLogin;
不建议的写法
@property(noatomic, assign) BOOL userLogin;
10.if判断里面的条件要提取出来
对于if里面很多的判断条件 要提取出来 方便之后进行断点测试
建议的写法
BOOL isTrue = 5 > 3;
if(isTrue) {
}
不建议的写法
if(5 > 3){
}
11.对于声明NSString const要对适应对应的模块
比如系统的 NSNotificationName
typedef NSString *NSNotificationName NS_EXTENSIBLE_STRING_ENUM;
建议的写法
typedef NSString *NSStringConfigProjectName;
FOUNDATION_EXPORT NSStringConfigprojectName const kConfigProjectPluginDebugBaseUrlString;
不建议的写法
FOUNDATION_EXPORT NSStringConfigprojectName const kConfigProjectPluginDebugBaseUrlString;
12.对于#define宏命名
单词全部的大写 单词之间用_分割
建议的写法
#define NS_AVAILABLE_IOS(_ios) CF_AVAILABLE_IOS(_ios)
不建议的写法
#define NS_AVAailableIos(_ios) CF_AVAILABLE_IOS(_ios)
13.block的命名规范
之前研究过很多的第三方的命名 对于苹果官方的没找到
有CallBack结尾 Complete结尾 Block结尾 还有CompletionHandle结尾的
我看到苹果很多的结尾都是用CompletionHandle结尾
大部分命名是Block我们按照Block命名
建议的写法
typedef void(DidUpdateViewCompletionHandle)(void)
错误的写法
typedef void(DidUpdateViewCallBack)
14.多用类型常量 少用#define
常量(预定义,枚举,局部常量等)使用小写k开头的驼峰法,比如kInvalidHandle,kWritePerm
建议的写法
static const NSTimeInterval kAnimationDuration = 0.3;
不建议的写法
#define ANIMATION_DURATION 0.3
15.提供全能的初始化方法
对于初始化参数有很多 但是不是一定全部使用的可以提供多个初始化方法
建议的写法
- (instancetype)initWithFrame:(CGRect)frame;
- (instancetype)initWithPerson:(GBPersonModel *)person;
- (instancetype)initWithFrame:(CGRect)frame person:(GBPersonModel *)person;
不建议的写法
- (instancetype)initWithFrame:(CGRect)frame person:(GBPersonModel *)person;
16.如果建议的使用Block和代理
我觉得代理可以用在写控件需要数据源赋值 和一些事件回调的时候使用
我查阅了苹果的block基本上都是执行一个时间 需要异步回调就使用block
如果没有主动执行动作 而是监听异步的回调 建议用代理
建议的写法
TestName *name = [[TestName alloc] init];
name.delegate = self;
[name searchText:text completionHandel:^(BOOL isExit) {
}];
- (void)name:(TestName)name resultTextHaveChanged:(NSString *)text {
}
不建议的写法
TestName *name = [[TestName alloc] init];
name.delegate = self;
[name searchText:text completionHandel:^(BOOL isExit) {
}];
name.resultTextHaveChange = ^(NSString *text) {
};
17.养成习惯把按照方法功能到分类里面
对于一些有按照功能类型的方法划分在一个分类里面 分类和之前类写在同一个文件
建议的写法
@interface WWPerson : NSObject
@end
@interface WWPerson (Friend)
// 朋友
- (void)addFriend:(WWPerson *)friend;
- (void)deleteFriend:(WWPerson *)friend;
@end
@interface WWPerson (Play)
// 娱乐
- (void)playSound;
- (void)playGame;
@end
不建议的写法
@interface WWPerson : NSObject
// 朋友
- (void)addFriend:(WWPerson *)friend;
- (void)deleteFriend:(WWPerson *)friend;
// 娱乐
- (void)playSound;
- (void)playGame;
@end
18.非要在自己类的分类添加读写的属性 可以用语法糖
可以利用主类的私有变量
建议的写法
@interface WWCustomView : UIView
@end
@interface WWCustomView (Add)
@property(noatomic, copy) NSString *name;
@end
#import "WWCustomView.h"
@implementation WWCustomView {
NSString * _name;
}
@end
@implementation WWCustomView (Add)
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end
不建议的写法
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, "name");
}
对于给第三方和系统的类非要添加属性 可以使用runtime。
19.需要便利字典和数组的内容 并且需要索引enumerator
[names enumerateObjectsUsingBlock:^(NSString * _Nonnull name, NSUInteger idx, BOOL * _Nonnull stop) {
}];
不建议的写法
for (int i = 0; i < names.count; i ++) {
NSString *name = names[i];
}
20.黄金大道
建议的写法
if (name.length <= 0) {
return;
}
if (![name isEqualToString:@"zhangsan"]) {
return;
}
......
不建议的写法
if (name.length > 0) {
if ([name isEqualToString:@"zhangsan"]) {
....
}
}
21.复杂的表达式
BOOL nameContainsSwift = [sessionName containsString:@"Swift"];
BOOL isCurrentYear = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession = nameContainsSwift ** isCurrentYear;
if (isSwiftSession) {
// Do something very cool
}
不建议的写法
if ([sessionName containsString:@"Swift"] && [sessionDateCompontents year] == 2014) {
// Do something very cool
}
22.类别命名
类名+标识+扩展 (UIImageView + HP + Web)
例:如果我们想要创建一个基于UIImageView 的类别用于网络请求图片,我们应该把类别放到名字是 UIImageView+HPWeb.h 的文件里。UIImageView为要扩展的类名,HP为专属标识,Web为扩展的功能。
类别的方法应该都是用一个前缀(型如hp_myCategoryMethodOnAString),以防止Objective-C代码在单名空间里冲突。如果代码本来就不考虑共享或在不同的地址空间,方法命名规则就没必要恪守了。
类别HPWeb头文件,UIImageView+HPWeb.h 如下:
@interface UIImageView(HPWeb)
- (void)hp_setImageWithUrlString:(NSString *)urlStr;
@end