【按语】由于我正在准备 模拟开发饿了么 这个App,到时可能有些iOS开发者参与进来。这时如果每个人的Objective-C编码风格都不一样,这样不易于保持代码一致性和难以Code Review。所以我在网上搜索到 The official raywenderlich.com Objective-C style guide 这篇关于Objective-C编码风格的文章,觉得可以作为这个项目的Objective-C的编码标准,所以就翻译这篇文章。 这篇编码风格指南概括了raywenderlich.com的编码规范,可能有些删减或修改。
我们制定Objective-C编码规范的原因是我们能够在我们的书,教程和初学者工具包的代码保持优雅和一致。即使我们有很多不同的作者来完成不同的书籍。
这里编码规范有可能与你看到的其他Objective-C编码规范不同,因为它主要是为了打印和Web的易读性。
这编码规范的创建是由很多来自raywenderlich.com团队成员在Nicholas Waynik的带领下共同完成的。团队成员有: Soheil Moayedi Azarpour 、 Ricardo Rendon Cepeda 、 Tony Dahbura 、 Colin Eberhardt 、 Matt Galloway 、 Greg Heo 、 Matthijs Hollemans 、 Christopher LaPollo 、 Saul Mora 、 Andy Pereira 、 Mic Pringle 、 Pietro Rea 、 Cesare Rocchi 、 Marin Todorov 、 Nicholas Waynik 和 Ray Wenderlich 。
我们也非常感谢New York Times 和Robots & Pencils'Objective-C编码规范的作者。这两个编码规范为本指南的创建提供很好的起点。
这里有些关于编码风格Apple官方文档,如果有些东西没有提及,可以在以下文档来查找更多细节:
应该使用US英语。
应该:
UIColor *myColor = [UIColor whiteColor];
不应该:
UIColor *myColour = [UIColor whiteColor];
在函数分组和protocol/delegate实现中使用#pragma mark -来分类方法,要遵循以下一般结构:
#pragma mark - Lifecycle - (instancetype)init {} - (void)dealloc {} - (void)viewDidLoad {} - (void)viewWillAppear:(BOOL)animated {} - (void)didReceiveMemoryWarning {} #pragma mark - Custom Accessors - (void)setCustomProperty:(id)value {} - (id)customProperty {} #pragma mark - IBActions - (IBAction)submitData:(id)sender {} #pragma mark - Public - (void)publicMethod {} #pragma mark - Private - (void)privateMethod {} #pragma mark - Protocol conformance #pragma mark - UITextFieldDelegate #pragma mark - UITableViewDataSource #pragma mark - UITableViewDelegate #pragma mark - NSCopying - (id)copyWithZone:(NSZone *)zone {} #pragma mark - NSObject - (NSString *)description {}
应该:
if (user.isHappy) { //Do something } else { //Do something else }
不应该:
if (user.isHappy) { //Do something } else { //Do something else }
应该:
// blocks are easily readable [UIView animateWithDuration:1.0 animations:^{ // something } completion:^(BOOL finished) { // something }];
不应该:
// colon-aligning makes the block indentation hard to read [UIView animateWithDuration:1.0 animations:^{ // something } completion:^(BOOL finished) { // something }];
当需要注释时,注释应该用来解释这段特殊代码为什么要这样做。任何被使用的注释都必须保持最新或被删除。
一般都避免使用块注释,因为代码尽可能做到自解释,只有当断断续续或几行代码时才需要注释。例外:这不应用在生成文档的注释
Apple命名规则尽可能坚持,特别是与这些相关的 memory management rules ( NARC )。
长的,描述性的方法和变量命名是好的。
应该:
UIButton *settingsButton;
不应该:
UIButton *setBut;
三个字符前缀应该经常用在类和常量命名,但在Core Data的实体名中应被忽略。对于官方的raywenderlich.com书、初学者工具包或教程,前缀'RWT'应该被使用。
常量应该使用驼峰式命名规则,所有的单词首字母大写和加上与类名有关的前缀。
应该:
static NSTimeInterval const RWTTutorialViewControllerNavigationFadeAnimationDuration = 0.3;
不应该:
static NSTimeInterval const fadetime = 1.7;
属性也是使用驼峰式,但首单词的首字母小写。对属性使用auto-synthesis,而不是手动编写@synthesize语句,除非你有一个好的理由。
应该:
@property (strong, nonatomic) NSString *descriptiveVariableName;
不应该:
id varnm;