iOS 编码规范

栏目: C · 发布时间: 5年前

内容简介:Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程序。关于 Objective-C 的编码规范,苹果和谷歌都已经有很好的总结:本文主要参考了对上述文档的翻译、查阅其他的相关资料和经过公司 iOS 小组的深刻讨论,为公司 iOS 小组总结出一份通用的编码规范

Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程序。关于 Objective-C 的编码规范,苹果和谷歌都已经有很好的总结:

Apple Coding Guidelines for Cocoa Google Objective-C Style Guide

本文主要参考了对上述文档的翻译、查阅其他的相关资料和经过公司 iOS 小组的深刻讨论,为公司 iOS 小组总结出一份通用的编码规范

命名规范

  • 基本原则

驼峰命名(特殊除外)

followAnchorButton
复制代码

尽可能清晰,尽量不使用缩写,建议使用完整单词

// 建议
setBackgroundColor
headImageView
settingButton

// 不建议
setBkgColor
headImg
setBtn
复制代码
  • 命名类

使用前缀:类前缀一般为项目名称缩写开头大写字母

前缀 + 描述 + 类型

//SuperTA 
|- STLoginViewController
|- STUserInfoModel
|- STHomeTableCell
|- STCenterTableHeaderView
复制代码
  • 命名方法

按照苹果的说法“好的方法名应当可以以一个句子的形式朗读出来”

一般以小写字母开头,每一个后续的单词首字母大写

// 动词开头的方法表示让对象执行一个动作
- (void)invokeWithTarget:(id)target;
复制代码
  • 命名属性

属性同样遵循第一个字母小写,后续单词首字母大写,同时不必添加前缀,采用非原子性 nonatomic + 对应内存管理方式关键字(这里不尽描述)进行修饰

(nontomic, 后添加空格,在 NSString* 前面均有空格,在 * 后面不需要空格!

// 建议
@property (nonatomic, copy) NSString *userName
// 不建议
@property (nonatomic,copy)NSString * userName
复制代码
  • 命名实例变量

命名实例变量,在变量名前加上 _ 前缀,其他和命名属性一样,建议 BOOL 类型的实例变量采用 _is 开头

@implementation simpleClass {
    BOOL _isShowVip; 
    NSString *_uploadImageUrlString
}
复制代码
  • 命名协议

当前类类名 + Delegate

// STCenterHeaderView

@protocol STCenterHeaderViewDelegate <NSObject>
复制代码
  • 协议方法

去掉项目大写前缀的协议名前面部分+具体方法命名

// STCenterHeaderViewDelegate

- (void)centerHeaderButtonClickWithTag:(NSInteger)tag
复制代码
  • RAC 的命名 调用 RAC 的时候,可以把所有方法实现在一个基础方法中
- (void)pickRac;
复制代码

class 结构

为明确区分 class 中方法类型,使 class 结构更清晰,最快定位到指定方法,特别是在 Controller 中,一旦逻辑稍微复杂,不熟悉代码很难一下子找到。so,这里从几个部分划分成几个模块,并尽量使用以下顺序。在每部分方法前用 pragma mark - <#object#> 注释

#pragma mark - life cycle     // class 生命周期
#pragma mark - set & get 	  // setter & getter 方法
#pragma mark - request		  // 网络请求
#pragma mark - notification	  //  通知
#pragma mark - action 	      // 事件处理(例:按钮点击事件)
#pragma mark - delegate   	  // 代理方法
#pragma mark - setupUI 		  // UI 相关 
#pragma mark - lazy load	  // 懒加载
#pragma mark - delloc
复制代码

代码格式

  • 方法书写

一个典型的 Objective-C 方法应该是这样的:

- (void)uploadImage:(UIImage *)image withToken:(NSString *)token linkAddress:(NSString *)linkAddress
{
  
}
复制代码

-(void) 之间应该有一个空格,第一个大括号 { 单独占一行。

  • 方法调用

注意一点是如果方法有多个参数或者方法过长,那么应该按照 : 来对其分行显示

[self uploadImage:image
        withToken:token
      linkAddress:linkAddress];
复制代码
  • 协议 Protocols

在一个头文件中正确定义一个协议的如下

@class 引用当前类

<> 中的协议和类型名之间 需要添加空格

默认对协议方法不写修饰符 @required @optional ,即默认为 @required ,但特殊情况下协议方法不要求必须实现的,使用 @required 修饰协议方法

协议属性使用 weak 关键字修饰,并且一般统一命名为 delegate

#import <UIKit/UIKit.h>
@class STMyWalletHeaderView;

@protocol STMyWalletHeaderViewDelegate<NSObject>

@optional
/** 1-提现 2充值 */
- (void)myWalletHeaderButtonClickWithTag:(NSInteger)tag;

@end
  
@interface STMyWalletHeaderView : UIView

@property (nonatomic, weak) id<STMyWalletHeaderViewDelegate> delegate;

@end
复制代码

项目规范

  • MVC 设计模式
  • UI 控件使用懒加载初始化

建议在整个项目中使用懒加载进行初始化,在初始化中定义好属性(例如定义好 UIButton 控件的属性),如果控件默认会显示在 view 上面则在懒加载中通过 addSubView 添加到 view ,使整个类文件代码更加清晰明朗。

例子:充值按钮的懒加载

-(UIButton *)rechargeButton
{
    if (!_rechargeButton) {
        _rechargeButton = [UIButton buttonWithTitle:@"充值"
                                        atTitleSize:15
                                       atTitleColor:White_Color
                                           atTarget:self
                                           atAction:@selector(buttonClick:)];
        _rechargeButton.backgroundColor = Main_Color;
        _rechargeButton.tag = 2;
        _rechargeButton.layer.masksToBounds = YES;
        _rechargeButton.layer.cornerRadius = 18;
        [self addSubview:_rechargeButton];
    }
    return _rechargeButton;
}
复制代码
  • Masonry 自动布局

建议在 setSubLayouat 方法中进行自动布局,在 viewDidLoad 中调用该方法

#pragma mark -- 布局
-(void)setSubLayout
{
    [self.whiteView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.offset(10);
        make.left.offset(16);
        make.right.offset(-16);
        make.height.offset(216);
    }];
    
    [self.subLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.offset(30);
        make.height.offset(38);
        make.right.equalTo(self.thireLabel.mas_left).offset(-4);
    }];
}
复制代码
  • 枚举定义类型常量

如果要定义一组相关的常量,尽量使用枚举类型(enumerations),枚举类型的命名规则和函数的命名规则相同,建议使用 NS_ENUMNS_OPTIONS 宏来定义枚举类型

从 1001 开始,根据苹果官方解释,0~1000 为苹果 SDK 使用

typedef NS_ENUM(NSInteger, ImagePickState){
    ImagePickStateNormal = 1001, // 系统自带
    ImagePickStateTZI // TZimagePick
};
复制代码
  • 一般使用 Delegate 传值

在界面传值、监听状态等均建议统一使用 Delegate

注释规范

  • 方法注释 快捷键 : Command + Option + /
/**
 加载全景图片

 @param imageName 全景图图片名称
 */
- (void)setImageWithName:(NSString *)imageName;
复制代码
  • 属性注释
/** 创建时间 */
@property (nonatomic, copy) NSString *createTime;
复制代码
  • 使用 #pragma mark - 区分方法
  • 其他

为了别给自己埋坑,或者给后人留条路走,强烈要求在写逻辑,特别是复杂逻辑的时候要写好注释。

工程规范

  • 目录结构

类文件除 AppDelegate 、man.h 外,其他均在 Classes 文件夹中,以模块划分,模块下面分别以 Model 、 View 、Controller 划分不同文件夹

例:

| — Classes
       | — Main  [基础框架]
       | — Home  [首页模块]
              | — Model 
              | — View 
                   | — Cell 
              | — Controller 
       | — Attention  [关注模块]
       | — Message  [消息模块]
       | — Center  [个人中心模块]
       | — Login  [登录注册模块]
复制代码
  • 图片资源

图片资源统一放在 Assets.xcassets 中,并根据模块区分存放不同文件夹


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Algorithms

Distributed Algorithms

Wan Fokkink / The MIT Press / 2013-12-6 / USD 40.00

This book offers students and researchers a guide to distributed algorithms that emphasizes examples and exercises rather than the intricacies of mathematical models. It avoids mathematical argumentat......一起来看看 《Distributed Algorithms》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具