Cocoa代码风格指南之排版规范(二)

本文基于 Google 的代码风格指南中关于排版规范的部分的总结,其中部门内容具有主观性。本文所有代码的排版均为建议的格式,如有文字上疏漏的地方,可以参考任何一段代码。首先通过一段代码来了解基本的排版格式。

  • [Apple]:Apple 明确给出建议
  • [Google]:Google 明确给出建议
  • [General]:通用做法(主观)
#import <Foundation/Foundation.h>

@interface Foo : NSObject

+ (instancetype)fooWithBar:(NSString *)bar;

- (instancetype)initWithBar:(NSString *)bar;

- (NSString *)bar;
- (void)setBar:(NSString *)bar;

- (BOOL)doWorkWithBlah:(NSString *)blah;

@end
#import "Foo.h"

@implementation Foo {
    NSString *bar;
    NSString *bam;
}

+ (id)fooWithBar:(NSString *)bar {
    return [[self alloc] initWithBar:bar];
}

- (id)init {
    return [self initWithBar:nil];
}

- (id)initWithBar:(NSString *)bar {
    self = [super init]
    if (self) {
        _bar = [bar copy];
        _bam = [[NSString alloc] initWithFormat:@"hi %d", 3];
    }
    return self;
}

- (NSString *)bar {
    return _bar;
}

- (void)setBar:(NSString *)bar {
    _bar = [bar copy];
}

- (BOOL)doWorkWithBlah:(NSString *)blah {
    return NO;
}

@end

上述代码中的所有换行、空格、缩进都为建议的格式。下边将进行更加详细的描述。

空格和制表符 [Google][General]

Google 建议使用2个空格来进行缩进,并且将编辑器设置成自动将制表符替换成空格。但这不符合大多数 Objective-C 程序员的习惯。所以还是建议所有的缩进都使用单个制表符。

行宽 [Google][General]

尽量让你的代码保持在 80 列之内。Objective-C 是一门繁冗的语言,在某些情况下略超 80 列可能有助于提高可读性,但这也只能是特例而已,不能成为开脱。如果阅读代码的人认为把把某行行宽保持在 80 列仍然有不失可读性,你应该按他们说的去做。这条规则是有争议的,但很多已经存在的代码坚持了本规则,所以 Google 觉得保证一致性更重要。通过设置 Xcode > Preferences > Text Editing > Show page guide,来使越界更容易被发现。这条规则对我个人有很强的约束,但很多代码难以实现80列,所以在这里还有很多值得探索的写法。

属性 [General]

@property (nonatomic, strong) NSString *string;
@property (nonatomic, weak) id<XXDelegate> delegate;
  • property 后留空格
  • nonatomic 放在修饰符第一位
  • 内存管理修饰符放在第二位
  • 修饰符中间在“,”后留空格
  • 修饰符“()”后留空格
  • 所有变量的类名后留空格
  • 类型标识符和尖括号内的协议名之间不能有任何空格

方法 [General]

- (void)doSomethingWith:(GTMFoo *)theFoo
                   rect:(NSRect)theRect
               interval:(float)theInterval {
    // TODO
}
- (void)short:(GTMFoo *)theFoo
    longKeyword:(NSRect)theRect
    evenLongerKeyword:(float)theInterval {
    // TODO
}
  • 方法返回值前留空格
  • 方法返回值后不留空格
  • 左括号和方法名在同行并有空格隔开
  • 多个参数的方法换行并以冒号对齐
  • 换行后如有某行过长导致冒号无法对齐则整体缩进一个制表符
  • 方法在声明、实现、调用时均上述规则

Block [Google][General]

// The entire block fits on one line.
[operation setCompletionBlock:^{ [self onOperationDone]; }];

// The block can be put on a new line, indented four spaces, with the
// closing brace aligned with the first character of the line on which
// block was declared.
[operation setCompletionBlock:^{
    [self.delegate newDataAvailable];
}];

// Using a block with a C API follows the same alignment and spacing
// rules as with Objective-C.
dispatch_async(fileIOQueue_, ^{
    NSString* path = [self sessionFilePath];
    if (path) {
        // TODO
    }
});

// An example where the parameter wraps and the block declaration fits
// on the same line. Note the spacing of |^(SessionWindow *window) {|
// compared to |^{| above.
[[SessionService sharedService]
    loadWindowWithCompletionBlock:^(SessionWindow *window) {
        if (window) {
            [self windowDidLoad:window];
        } else {
            [self errorLoadingWindow];
        }
    }];

// An example where the parameter wraps and the block declaration does
// not fit on the same line as the name.
[[SessionService sharedService]
    loadWindowWithCompletionBlock:
        ^(SessionWindow *window) {
            if (window) {
                [self windowDidLoad:window];
            } else {
                [self errorLoadingWindow];
            }
        }];

// Large blocks can be declared out-of-line.
void (^largeBlock)(void) = ^{
    // TODO
};
[operationQueue_ addOperationWithBlock:largeBlock];
  1. 如果一行可以写完块,则没必要换行。
  2. 如果不得不换行,关括号应与块声明的第一个字符对齐。
  3. 块内的代码须按 4 空格缩进。
  4. 如果块太长,比如超过 20 行,建议把它定义成一个局部变量,然后再使用该变量。
  5. 如果块不带参数,^{ 之间无须空格。如果带有参数,^( 之间无须空格,但 ) { 之间须有一个空格。
  6. 块内允许按两个空格缩进,但前提是和项目的其它代码保持一致的缩进风格。
  • 如果重载了 NSObject 类的方法,强烈建议把它们放在 @implementation 内的起始处,这也是常见的操作方法。通常适用(但不局限)于 init...,copyWithZone:,以及 dealloc 方法。所有 init... 方法应该放在一起,copyWithZone: 紧随其后,最后才是 dealloc 方法。 [Google][General]

  • 指定初始化方法使用 NS_DESIGNATED_INITIALIZER 标示。 [General]

  • 写子类时如果需要 init… 方法,记得重载父类的指定构造函数。 [Google][General]

// UIView
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // TODO
    }
    return self;
}

博客:xuyafei.cn
简书:jianshu.com/users/2555924d8c6e
微博:weibo.com/xuyafei86
Github:github.com/xiaofei86

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,428评论 21 35
  • 推荐文章:禅与 Objective-C 编程艺 前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、...
    WolfTin阅读 2,747评论 0 1
  • Cocoa代码风格指南之命名规范(一) Cocoa代码风格指南之排版规范(二) Cocoa代码风格指南之注释规范(...
    xuyafei86阅读 3,349评论 0 8
  • 一个统一的编程风格不但能够增强代码可读性,也可以避免许多低级问题。一个严格遵从编码规范的团队,代码无论出自多少人之...
    七弦桐语阅读 616评论 0 2
  • 11月的最后一天,起的不算早今天要去报道了,但是有些没自信即使需要面对巨额信用卡账单,我相信我能搞定人生就是这样,...
    小白和小黑阅读 267评论 0 0