美文网首页
关于Objective-C代码规范的22条总结

关于Objective-C代码规范的22条总结

作者: iOS_Coder | 来源:发表于2019-07-16 18:59 被阅读0次

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

相关文章

  • 小肤iOS开发代码规范_v1.0

    For Objective-C , 2018.8.2 Ⅰ.前言Ⅱ.命名规范Ⅲ.代码注释规范Ⅳ.代码格式化规范Ⅴ....

  • PHP 编程规范

    关于PHP编程的规范 自己总结出的一些规范,方便大家参考 ,主要从代码版本管理规范以及代码自身的规范。 代码版本管...

  • 关于Objective-C代码规范的22条总结

    1.头文件#import的顺序 写法模板 建议的写法 不建议的写法 2.@Class的写法 写法模板:@class...

  • Objective-C代码规范

    团队的Objective-C代码规范。本文主要内容来自raywenderlich.com Objective-C编...

  • Objective-C我的代码规范

    Objective-C代码规范 前言 代码规范,统一才是最好的,团队开发中切记不要自己搞一套,跟着团队规范走 目录...

  • iOS 代码规范

    iOS规范:仅适用于iOS的代码规范(使用Objective-C语言)。 一.代码应该简洁易懂,逻辑清晰 不要过分...

  • iOS代码规范

    iOS代码规范 一、前言 本规范基于Google Objective-C Style Guide和百度Object...

  • 代码规范

    苹果代码规范 禅与 Objective-C 编程艺术 (Zen and the Art of the Object...

  • Objective-C编程规范

    引言 背景 Apple官方的代码规范, 供补充参考: The Objective-C Programming La...

  • 2020-07-24

    # 纽约时报 移动团队 Objective-C 规范指南 这份规范指南概括了纽约时报 iOS 团队的代码约定。 #...

网友评论

      本文标题:关于Objective-C代码规范的22条总结

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