iOS-常见编程规范汇总

关于编程语言的所有规范,如果这里没有写到,那就在苹果的文档里:


目录

  • 点语法
  • 间距
  • 条件判断
  • 三目运算符
  • 错误处理
  • 方法
  • 变量
  • 命名
  • 注释
  • init 和 dealloc
  • 字面量
  • CGRect 函数
  • 常量
  • 枚举类型
  • 私有属性
  • 图片命名
  • 布尔
  • 单例
  • 导入
  • Xcode 工程

点语法

应该 始终 使用点语法来访问或者修改属性,访问其他实例时首选括号。

推荐:

view.backgroundColor = [UIColor orangeColor];

[UIApplication sharedApplication].delegate;

反对:

[view setBackgroundColor:[UIColor orangeColor]];

UIApplication.sharedApplication.delegate;

间距

  • 一个缩进使用 4 个空格,或使用制表符(tab)缩进。
  • 方法的大括号和其他的大括号(if/else/switch/while 等等)始终和声明在同一行开始,在新的一行结束。

推荐:

if (user.isHappy) {
    // Do something
} else {
    // Do something else
}
  • 方法之间应该正好空一行,这有助于视觉清晰度和代码组织性。在方法中的功能块之间应该使用空白分开,但往往可能应该创建一个新的方法。

条件判断

条件判断主体部分应该始终使用大括号括住来防止出错,即使它可以不用大括号(例如它只需要一行);

这些错误包括添加第二行(代码)并希望它是 if 语句的一部分时;

还有另外一种更危险的,当 if 语句里面的一行被注释掉,下一行就会在不经意间成为了这个 if 语句的一部分;

此外,这种风格也更符合所有其他的条件判断,因此也更容易检查。

推荐:

if (!error) {
    return success;
}

反对:

if (!error)
    return success;

if (!error) return success;

三目运算符

三目运算符,? ,只有当它可以增加代码清晰度或整洁时才使用。单一的条件都应该优先考虑使用。多条件时通常使用 if 语句会更易懂,或者重构为实例变量。

推荐:

result = a > b ? x : y;

反对:

result = a > b ? x = c > d ? c : d : y;

错误处理

当引用一个返回错误参数(error parameter)的方法时,应该针对返回值,而非错误变量。

推荐:

NSError *error;
if (![self trySomethingWithError:&error]) {
    // 处理错误
}

反对:

NSError *error;
[self trySomethingWithError:&error];
if (error) {
    // 处理错误
}

一些苹果的 API 在成功的情况下会写一些垃圾值给错误参数(如果非空),所以针对错误变量可能会造成虚假结果(以及接下来的崩溃)。


方法

在方法签名中,在 -/+ 符号后应该有一个空格。方法片段之间也应该有一个空格。

推荐:

- (void)setExampleText:(NSString *)text image:(UIImage *)image;

变量

变量名应该尽可能命名为描述性的。除了 for() 循环外,其他情况都应该避免使用单字母的变量名。

星号表示指针属于变量,例如:NSString *text 不要写成 NSString* text 或者 NSString * text

常量除外。

尽量定义属性来代替直接使用实例变量。

除了初始化方法(initinitWithCoder:,等), dealloc 方法和自定义的 setters 和 getters 内部,应避免直接访问实例变量。

推荐:

@interface Model: NSObject

@property(nonatomic,copy)NSString *name;

@end

反对:

@interface Model : NSObject {
    NSString *headline;
}
// *号应和实例变量在一起
@property(nonatomic,copy)NSString * name;
@property(nonatomic,copy)NSString* name;

变量限定符

当涉及到在 ARC 中被引入变量限定符时,

限定符 (__strong, __weak, __unsafe_unretained, __autoreleasing) 应该位于星号和变量名之间,如:NSString * __weak text


命名

尽可能遵守苹果的命名约定,尤其那些涉及到内存管理规则,(NARC)的。

长的和描述性的方法名和变量名都不错。

推荐:

UIButton *settingsButton;

反对:

UIButton *setBut; // 不明确

属性和局部变量应该使用驼峰命名法并且首字母小写。

为了保持一致,实例变量应该使用驼峰命名法命名,并且首字母小写,以下划线为前缀。这与 LLVM 自动合成的实例变量相一致。

如果 LLVM 可以自动合成变量,那就让它自动合成。

推荐:

@synthesize descriptiveVariableName = _descriptiveVariableName;

反对:

id varnm;

注释

当需要的时候,注释应该被用来解释 为什么 特定代码做了某些事情。所使用的任何注释必须保持最新否则就删除掉。

通常应该避免一大块注释,代码就应该尽量作为自身的文档,只需要隔几行写几句说明。这并不适用于那些用来生成文档的注释。


init 和 dealloc

dealloc 方法应该放在实现文件的最上面,并且刚好在 @synthesize@dynamic 语句的后面。在任何类中,init 都应该直接放在 dealloc 方法的下面。

init 方法的结构应该像这样:

- (instancetype)init {
    self = [super init]; // 或者调用指定的初始化方法
    if (self) {
        // Custom initialization
    }

    return self;
}

字面量

每当创建 NSStringNSDictionaryNSArray,和 NSNumber 类的不可变实例时,都应该使用字面量。要注意 nil 值不能传给 NSArrayNSDictionary 字面量,这样做会导致崩溃。

推荐:

NSArray *names = @[@"Marry", @"Maya", @"Vivian", @"Alex", @"Eric", @"Cherry"];
NSDictionary *products = @{@"name" : @"iPhone 7", @"date" : @"2016-11-11", @"size" : @"5.5"};
NSNumber *isHappyToday = @YES;
NSNumber *phoneNumber = @110120119;

反对:

NSArray *names = [NSArray arrayWithObjects:@"Marry", @"Maya", @"Vivian", @"Alex", @"Eric", @"Cherry", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"iPhone 7", @"name", @"2016-11-11", @"date", @"5.5", @"size", nil];
NSNumber *isHappyToday = [NSNumber numberWithBool:YES];
NSNumber *phoneNumber = [NSNumber numberWithInteger:10018];

CGRect 函数

当访问一个 CGRectxywidthheight 时,应该使用CGGeometry 函数代替直接访问结构体成员。苹果的 CGGeometry 参考中说到:

All functions described in this reference that take CGRect data structures as inputs implicitly standardize those rectangles before calculating their results. For this reason, your applications should avoid directly reading and writing the data stored in the CGRect data structure. Instead, use the functions described here to manipulate rectangles and to retrieve their characteristics.

翻译:CGRect里面的所有功能描述,通过CGRect隐式数据方法,可以在矩形数据结果计算之前作为输入规范。由于这个原因,您的应用程序应该避免直接读取和写入CGRect中的数据或数据结构。相反,使用这里描述的函数来操纵矩形和检索他们的特征。

推荐:

CGRect frame = self.view.frame;

CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);

反对:

CGRect frame = self.view.frame;

CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;

常量

常量首选内联字符串字面量或数字,因为常量可以轻易重用并且可以快速改变而不需要查找和替换。常量应该声明为 static 常量而不是 #define ,除非非常明确地要当做宏来使用。

推荐:

static NSString * const reusableCellIdentifier = @"Identifier";

static const CGFloat cellHeight = 50.0;

反对:

#define reusableCellIdentifier @"Identifier"

#define cellHeight 20.0

枚举类型

当使用 enum 时,建议使用新的基础类型规范,因为它具有更强的类型检查和代码补全功能。现在 SDK 包含了一个宏来鼓励使用使用新的基础类型 - NS_ENUM()

推荐:

typedef NS_ENUM(NSInteger, XMButtonsType) {
    XMButtonsTypeAdd,
    XMButtonsTypeDecline
};

私有属性

私有属性应该声明在类实现文件的延展(Extension)中。

推荐:

@interface XMViewController ()

@property (nonatomic, copy) NSString *privateName;
@property (nonatomic, assign) NSInteger count;
@property (nonatomic, strong) NSMutableArray *dataSource;

@end

图片命名

图片名称应该被统一命名以保持组织的完整。它们应该被命名为一个说明它们用途的驼峰式字符串,其次是自定义类或属性的无前缀名字(如果有的话),然后进一步说明颜色 和/或 展示位置,最后是它们的状态。

推荐:

  • RefreshBarButtonItem / [email protected]RefreshBarButtonItemSelected / [email protected]

图片目录中被用于类似目的的图片应归入各自的组中。


布尔

因为 nil 解析为 NO,所以没有必要在条件中与它进行比较。永远不要直接和 YES 进行比较,因为 YES 被定义为 1,而 BOOL 可以多达 8 位。

这使得整个文件有更多的一致性和更大的视觉清晰度。

推荐:

if (!someObject) {
}

反对:

if (someObject == nil) {
}


对于 BOOL 来说, 这有两种用法:

if (isTrue)
if (![someObject boolValue])

反对:

if ([someObject boolValue] == NO)
if (isTrue == YES) // 不要这么做

如果一个 BOOL 属性名称是一个形容词,属性可以省略 “is” 前缀,但为 get 访问器指定一个惯用的名字,例如:

@property (assign, getter=isEditable) BOOL editable;

单例

单例对象应该使用线程安全的模式创建共享的实例。(建议使用GCD创建单例)

+ (instancetype)sharedInstance {
    static id sharedInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

导入

如果有一个以上的 import 语句,就对这些语句进行分组。每个分组的注释是可选的。

// Frameworks
#import <UIKit/UIKit.h>

// ViewController
#import "XMViewController.h"

// Models
#import "XMUser.h"

// Views
#import "XMButton.h"
#import "XMUserView.h"

Xcode 工程

为了避免文件杂乱,物理文件应该保持和 Xcode 项目文件同步。Xcode 创建的任何组(group)都必须在文件系统有相应的映射。为了更清晰,代码不仅应该按照类型进行分组,也可以根据功能进行分组。

举例:(按类型分)

时间: 2024-08-06 16:04:41

iOS-常见编程规范汇总的相关文章

ios基础-编程规范

养成良好的编程习惯,是開始一门新语言的首要前提. (一)文档结构规范 1.建立Libs目录,存放第三方库 2.建立Tools目录,存放自己封装的类库 3.建立ViewControllers目录,存放全部的ViewControl 4.建立Request目录,存放网络请求 5.建立Cell目录,存放列表item 6.在Supporting Files目录下建立Images.Music和Video等相关目录,分别存放图片.音频.视频等资源. 7.建立RootViewController首页,放在底层文

Python常见编程规范总结

Pythonic定义 Python最常用的编码风格还是PEP8,详见:http://jython.cn/dev/peps/pep-0008/ Pythonic确实很难定义,先简单引用下<Python之禅>中的几句经典阐释: 优美胜于丑陋(Python 以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现) 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁) 扁平胜于嵌套(优美的

iOS编程规范(整理)

一.文档结构管理 1.建立Libraries文件夹,所有第三方库放入其中. 2.建立Utilities文件夹,自已封装的类放入其中. 3.建立Constants.h头文件,所有的常量定义于其中.Constants.h文件放入Main文件组里面. 4.每个功能块放入一个Group,在目录里建立实际文件夹管理. 5.程序资源文件放入Supporting Files文件夹中.如.plist.数据库资料等. 6.在Supporting Files文件夹下建立Image.Music和Video等相关文件夹

ios 编程规范

转自:http://www.cnblogs.com/celestial/archive/2012/06/30/2571417.html iOS编程规范 编码规范 一.文档结构管理 1.建立Libraries文件夹,所有第三方库放入其中. 2.建立Utilities文件夹,自已封装的类放入其中. 3.建立Constants.h头文件,所有的常量定义于其中.Constants.h文件放入Main文件组里面. 4.每个功能块放入一个Group,在目录里建立实际文件夹管理. 5.程序资源文件放入Supp

常见编程简称收集汇总

此文为收藏常见编程术语的英文缩写.英文全称.中文翻译全称. 主要经常使用却不知其意,为了更好的理解和学习各项编程技能,就收藏了下. 1.编程语言.标准.协议.字符编码 HTML HTML 指的是超文本标记语言 (Hyper Text Markup Language) XML XML 指可扩展标记语言(EXtensible Markup Language) CSS CSS 指层叠样式表 (Cascading Style Sheets) JS 一般指  JavaScript   指以 ECMAScr

iOS:Cocoa编码规范 -[译]Coding Guidelines for Cocoa

--原文地址:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/FrameworkImpl.html Cocoa编码规范 --前言 用公共API开发一个Cocoa框架,插件,或其他可执行目标,里面的命名编写和规范不同于一般应用程序的开发.因为你开发出来东西是给开发者用的看的,并且他们不熟悉你的编程接口.这个时候API的命名约定就派上用场了,因为它使你的写

iOS网络编程开发—JSON和XML数据解析

iOS网络编程开发—JSON解析 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的

华为C语言编程规范

DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd.版权所有 侵权必究All rights reserved密级:confidentiality levelDKBA 2826-2011.52011-06-02 华为机密,未经许可不得扩散 Huawei Confidential 第2页,共61页Page 2 , Total61修订声明Revision

Windows客户端C/C++编程规范“建议”——函数

1 函数 1.1 代码行数控制在80行及以内 等级:[要求] 说明:每个函数的代码行数控制应该控制在80行以内.如果超过这个限制函数内部逻辑一般可以拆分.如果试图超过这个标准,请列出理由.但理由不包含如下: 无法拆分. 流程内部逻辑复杂,无需拆分,即使拆分了,拆分的函数也不会被其他地方用到.(解释:拆分可以减少代码行数,提炼后的函数可以方便读者快速理解函数逻辑并定位问题.) 1.2 代码列数控制在100字符及以内 等级:[要求] 说明:每行代码不可以超过100字符.如果超过这个字符数,代码的美观