IOS 代碼書寫風格規範

來源:互聯網
上載者:User

IOS 代碼書寫風格規範
點標記文法 屬性和等冪方法(多次調用和一次調用返回的結果相同)使用點標記文法訪問,其他的情況使用方括弧標記文法。 良好的風格: view.backgroundColor = [UIColor orangeColor]; [UIApplication sharedApplication].delegate; 不良的風格: [view setBackgroundColor:[UIColor orangeColor]]; UIApplication.sharedApplication.delegate; 間距 二元運算子和參數之間需要放置一個空格,一元運算子、強制類型轉換和參數之間不放置空格。關鍵字之後圓括弧之前需要放置一個空格。

void *ptr = &value + 10 * 3;

NewType a = (NewType)b;

 

for (int i = 0; i < 10; i++) {

doCoolThings();

}

 

數組和字典類型的字面值的方括弧兩邊各放置一個空格。

NSArray *theShit = @[ @1, @2, @3 ];

字典字面值的鍵和冒號之間沒有空格,冒號和值之間有一個空格。 NSDictionary *keyedShit = @{ GHDidCreateStyleGuide: @YES }; C函式宣告中,左括弧的前面不保留空格,並且函數名應該像類一樣帶有命名空間標識。 良好的風格: void RNCwesomeFunction(BOOL hasSomeArgs); 長的字面值應被拆分為多行。 良好的風格:

NSArray *theShit = @[

@"Got some long string objects in here.",

[AndSomeModelObjects too],

@"Moar strings."

];

 

NSDictionary *keyedShit = @{

@"this.key": @"corresponds to this value",

@"otherKey": @"remoteData.payload",

@"some": @"more",

@"JSON": @"keys",

@"and": @"stuff",

};

每一行代碼使用4個空格縮排。不使用tab縮排。是在Xcode的Preferences進行縮排設定的。 方法簽名以及其他關鍵字(if/else/switch/while等)後面跟隨的左花括弧總是和語句出現於同一行,而右花括弧獨佔一行。 良好的風格:

if (user.isHappy) {

//Do something

}

else {

//Do something else

}

如果一個方法內有多個功能區域,可以使用空行分隔功能區域。 每一行代碼不要超過100個字元。 每一個方法之前都有一個99字元寬的注釋行,注釋行相對於使用空行更能提高代碼的辨識度,當一行代碼很長的時候,注釋行也起到了越界檢測的作用。注釋行: /////////////////////////////////////////////////////////////////////////////////////////////////// 條件陳述式 所有的邏輯塊必須使用花括弧包圍,即使條件體只需編寫一行代碼也必須使用花括弧。 良好的風格做法:

if (!error) {

return success;

}

不良的風格:

if (!error)

return success;

或: if (!error) return success; 三元運算子 長的三元運算子應使用圓括弧括起來。三元運算子僅用於賦值和做參數。 Blah *a = (stuff == thing ? foo : bar); 合并的nil三元運算子應該盡量避免。 不良的風格: Blah *b = thingThatCouldBeNil ?: defaultValue; 多分支條件應該使用if語句或重構為執行個體變數。 良好的風格: result = a > b ? x : y; 不良的風格: result = a > b ? x = c > d ? c : d : y; 異常和錯誤處理 不要在流量控制語句中使用異常(NSException)。 異常僅用於表明程式員的錯誤。 為了表明一個錯誤,使用NSError *。 當一個方法通過引用返回一個錯誤參數,應該檢測傳回值的狀態,而不是錯誤參數的狀態。 良好的風格:

NSError *error;

if (![self trySomethingWithError:&error]) {

// Handle Error

}

不良的風格:

NSError *error;

[self trySomethingWithError:&error];

if (error) {

// Handle Error

}

在方法執行成功的情況下賦值非Null值給錯誤參數,會使路徑跳轉到假條件分支(隨後程式奔潰)。 代理 除了繼承一個類或實現一個協議,否則在標頭檔中僅使用類聲明@class指令,不用#import匯入類標頭檔。 如果一個delegate只有幾個方法,比如只是提交和取消,推薦使用block編寫動作響應代碼。 由於代理方法的聲明一般都很長,所以必須將代理對象和其他的協議對象放在執行個體變數定義的下面,否則執行個體變數定義的對齊將會被打亂掉。 當需要實現多個協議的時候,將每一個協議名拆分到單獨的行。 良好的風格:

@interface CustomModelViewController : TTViewController <

TTModelDelegate,

TTURLRequestDelegate

> {

方法 一個方法的命名首先描述返回什麼,接著是什麼情況下被返回。方法簽名中冒號的前面描述傳入參數的類型。以下類方法和執行個體方法命名的格式文法:

[object/class thing+condition];

[object/class thing+input:input];

[object/class thing+identifer:input];

Cocoa命名舉例:

realPath = [path stringByExpandingTildeInPath];

fullString = [string stringByAppendingString:@"Extra Text"];

object = [array objectAtIndex:3];

// 類方法

newString = [NSString stringWithFormat:@"%f",1.5];

newArray = [NSArray arrayWithObject:newString];

良好的自訂方法命名風格:

recipients = [email recipientsSortedByLastName];

newEmail = [CDCEmail emailWithSubjectLine:@"Extra Text"];

emails = [mailbox messagesReceivedAfterDate:yesterdayDate];

當需要擷取對象值的另一種類型的時候,方法命名的格式文法如下:

[object adjective+thing];

[object adjective+thing+condition];

[object adjective+thing+input:input];

良好的自訂方法命名風格:

capitalized = [name capitalizedString];

rate = [number floatValue];

newString = [string decomposedStringWithCanonicalMapping];

subarray = [array subarrayWithRange:segment];

方法簽名盡量做到含義明確。 不良的風格:

-sortInfo // 是返回排序結果還是給info做排序

-refreshTimer // 返回一個用於重新整理的定時器還是重新整理定時器

-update // 更新什麼,如何更新

良好的風格:

-currentSortInfo // "current" 清楚地修飾了名詞SortInfo

-refreshDefaultTimer // refresh是一個動詞。

-updateMenuItemTitle // 一個正在發生的動作

方法類型修飾符+/-後要放置一個空格,各參數名之間也要放置一個空格。 良好的風格: - (void)setExampleText:(NSString *)text image:(UIImage *)image; 如果方法的命名特別長,將方法名拆分成多行。 良好的風格:

color = [NSColor colorWithCalibratedHue: 0.10

saturation: 0.82

brightness: 0.89

alpha: 1.00];

不要將私人的執行個體變數和方法聲明在標頭檔中,應將私人變數和方法聲明在實現檔案的類擴充內。
不良的風格:

//MyViewController.h檔案

@interface MyViewController : UIViewController<

UITalbeViewDataSource,

UITableViewDelegate> {

@private:

UITableView *_myTableView; // 私人執行個體變數

}

// 內部使用的屬性

@property (nonatomic,strong) NSNumber *variableUsedInternally;

- (void)sortName; // 只用於內部使用的方法

@end

良好的風格:

//MyViewController.m檔案使用類擴充

@interface MyViewController()<

UITalbeViewDataSource,

UITableViewDelegate> {

UITableView *_myTableView;

// 外部需要訪問的執行個體變數聲明為屬性,不需要外部存取的聲明為執行個體變數

NSNumber * variableUsedInternally;

}

// 從Xcode4.3開始,可以不寫方法的前置聲明,Interface Builder和Storyboard仍然可以找到方法的定義

@end

建構函式通常應該返回執行個體類型而不是id類型 參數 方法參數名前一般使用的首碼包括“the”、“an”、“new”。 良好的風格:

- (void) setTitle: (NSString *) aTitle;

- (void) setName: (NSString *) newName;

- (id) keyForOption: (CDCOption *) anOption

- (NSArray *) emailsForMailbox: (CDCMailbox *) theMailbox;

- (CDCEmail *) emailForRecipients: (NSArray *) theRecipients;

變數 變數的命令應盡量做到自描述。除了在for()迴圈語句中,單字母的變數應該避免使用(如i,j,k等)。一般迴圈語句的當前對象的命名首碼包括“one”、“a/an”。對於簡單的單個對象使用“item”命名。 良好的風格:

for (i = 0; i < count; i++) {

oneObject = [allObjects objectAtIndex: i];

NSLog (@"oneObject: %@", oneObject);

}

 

NSEnumerator *e = [allObjects objectEnumerator];

id item;

while (item = [e nextObject])

NSLog (@"item: %@", item);

指標變數的星號指示符應該緊靠變數,比如NSString *text,而不是NSString* text或NSString * text。 盡量的使用屬性而非執行個體變數。除了在初始化方法(init,initWithCoder:等)、dealloc方法以及自訂setter與getter方法中訪問屬性合成的執行個體變數,其他的情況使用屬性進行訪問。 良好的風格:

@interface RNCSection: NSObject

@property (nonatomic) NSString *headline;

@end

不良的風格:

@interface RNCSection : NSObject {

NSString *headline;

}

當你使用@synthesize指令時,編譯器會自動為你建立一個底線_開頭的的執行個體變數,所以不需要同時聲明執行個體變數和屬性。 不良的風格:

@interface RNCSection : NSObject {

NSString *headline;

}

@property (nonatomic) NSString *headline;

@end

良好的風格:

@interface RNCSection: NSObject

@property (nonatomic) NSString *headline;

@end

不要使用@synthesize除非是編譯器需要。注意在@protoco協議中的@optional可選屬性必須被顯式地使用@synthesize指令合成屬性。 縮減詞 雖然方法命名不應使用縮減詞,然而有些縮減詞在過去被反覆的使用,所以使用這些縮減詞能更好的的表達代碼的含義。下表列出了Cocoa可接受的縮減詞。 ........................................................ 以下是一些常用的首字母縮減詞 ASCII PDF XML HTML URL RTF HTTP TIFF JPG PNG GIF LZW ROM RGB CMYK MIDI FTP 命名 方法和變數的命令應該儘可能做到自描述。 良好的風格: UIButton *settingsButton; 不良的風格: UIButton *setBut; 對於NSString、NSArray、NSNumber或BOOL類型,變數的命名一般不需要表明其類型。 良好的風格:

NSString *accountName;

NSMutableArray *mailboxes;

NSArray *defaultHeaders;

BOOL userInputWasUpdated;

不良的風格:

NSString *accountNameString;

NSMutableArray *mailboxArray;

NSArray *defaultHeadersArray;

BOOL userInputWasUpdatedBOOL;

如果變數不是以上基本常用類型,則變數的命名就應該反映出自身的類型。但有時僅需要某些類的一個執行個體的情況下,那麼只需要基於類名進行命名。

NSImage *previewPaneImage;

NSProgressIndicator *uploadIndicator;

NSFontManager *fontManager; // 基於類名命名

大部分情況下,NSArray或NSSet類型的變數只需要使用單詞複數形式(比如mailboxes),不必在命名中包含“mutable”。如果複數變數不是NSArray或NSSet類型,則需要指定其類型。 良好的風格:

NSDictionary * keyedAccountNames;

NSDictionary * messageDictionary;

NSIndexSet * selectedMailboxesIndexSet;

由於Objective-C不支援名字空間,為了防止出現命名空間的衝突,在類名和常類型變數名前添加一個由三個大寫的字母組成的首碼(如RNC),對於Core Data實體名則可以忽略此規則。如果你子類化了標準的Cocoa類,將首碼和父類名合并是一個很好的做法。如繼承UITableView的類可命名為RNCTableView。 常類型變數名的書寫風格採用駝峰式大小寫(第一個單詞的首字母小寫,其餘單詞的第一個字母大寫。如firstName而不是first_name或firstname。),並使用關聯的類名作為其命名首碼, 推薦的做法: static const NSTimeInterval RNCArticleViewControllerNavigationFadeAnimationDuration = 0.3; 不推薦的做法: static const NSTimeInterval fadetime = 1.7; 底線 使用屬性的時候,執行個體變數應該使用self.進行訪問和設值。局部變數的命令不要包含底線。執行個體變數的命名必須使用底線_作為首碼,這樣可以縮小Xcode自動完成的選項取值範圍。 注釋 在需要的時候,注釋可對代碼做必要的解釋。更新代碼時一定要更新注釋,防止對代碼造成誤解。 使用javadoc風格的文檔注釋文法。注釋的第一行是對注釋API的總結,隨後的注釋行是對代碼更多細節的解釋。 良好的風格:

/**

* The maximum size of a download that is allowed.

*

* If a response reports a content length greater than the max * will be cancelled. This is helpful for preventing excessive memory usage.

* Setting this to zero will allow all downloads regardless of size.

*

* @default 150000 bytes

*/

@property (nonatomic) NSUInteger maxContentLength;

init與dealloc dealloc方法應該被放置在實現方法的頂部,直接在@synthesize或@dynamic語句之後。init方法應該被放置在dealloc方法的下面。 init方法的結構看上去應該像這樣:

- (instancetype)init {

self = [super init]; // or call the designated initalizer

if (self) {

// Custom initialization

}

 

return self;

}

字面值 對於NSString,NSDictionary,NSArray和NSNumber類,當需要建立這些類的不可變執行個體時,應該使用這些類的字面值表示形式。使用字面值表示的時候nil不需要傳入NSArray和NSDictionary中作為字面值。這種文法相容老的iOS版本,因此可以在iOS5或者更老的版本中使用它。 良好的風格:

NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];

NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};

NSNumber *shouldUseLiterals = @YES;

NSNumber *buildingZIPCode = @10018;

不良的風格:

NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];

NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];

NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];

NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];

如非必要,避免使用特定類型的數字(相較於使用5.3f,應使用5.3)。 CGRect函數 相較於使用結構體輔助函數(如CGRectMake()函數),優先使用C99結構體初始化文法。 CGRect rect = {.origin.x = 3.0, .origin.y = 12.0, .size.width = 15.0, .size.height = 80.0 }; 當訪問CGRect結構體的x、y、width、height成員時,應使用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 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 RNCAboutViewControllerCompanyName = @"The New York Times Company";

static const CGFloat RNCImageThumbnailHeight = 50.0;

不良的風格:

#define CompanyName @"The New York Times Company"

#define thumbnailHeight 2

枚舉類型 當使用enum關鍵字時,推薦使用蘋果最新引入的固定基礎類型文法,因為這將獲得強型別檢查與程式碼完成功能。SDK現在包含了一個固定基礎類型的宏——NS_ENUM()。 NS_ENUM是在iOS6中開始引入的,為了支援之前的iOS版本,使用簡單的內聯方法:

#ifndef NS_ENUM

#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type

#endif

良好的風格:

typedef NS_ENUM(NSInteger, RNCAdRequestState) {

RNCAdRequestStateInactive,

RNCAdRequestStateLoading

};

私人屬性 私人屬性應該被聲明在實現檔案的類擴充中(即匿名的category)。不要將私人屬性聲明在命名的category(如RNCPrivate或private),除非是擴充其他類。 良好的風格:

@interface NYTAdvertisement ()

 

@property (nonatomic, strong) GADBannerView *googleAdView;

@property (nonatomic, strong) ADBannerView *iAdView;

@property (nonatomic, strong) UIWebView *adXWebView;

 

@end

圖片的命名 圖片的命名應該保持一致,以圖片的用途描述作為圖片檔案名稱。檔案名稱的命名使用駝峰式大小寫風格,檔案名稱後可跟隨一個自訂的類名或者是自訂的屬性名稱(如果有屬性名稱)、也可以再跟上顏色描述以及/或者位置、圖片的最終狀態。
良好的風格: RefreshBarButtonItem / RefreshBarButtonItem@2x 和 RefreshBarButtonItemSelected / RefreshBarButtonItemSelected@2x ArticleNavigationBarWhite / ArticleNavigationBarWhite@2x 和 ArticleNavigationBarBlackSelected / ArticleNavigationBarBlackSelected@2x. 被用作相似用途的圖片應該使用一個圖片檔案夾進行分開管理。 布爾類型 因為nil被解析為了NO,所以和nil作比較沒有任何的必要。不要將變數和YES直接比較,因為YES被定義為1而BOOL類型是8位的unsigned int,即BOOL的值不僅僅是1或0。 良好的風格:

if (!someObject) {

}

不良的風格:

if (someObject == nil) {

}

對於一個BOOL值:兩種最佳實務:

if (isAwesome)

if (![someObject boolValue])

不良的風格:

if ([someObject boolValue] == NO)

if (isAwesome == YES) // Never do this.

如果一個BOOL類型的屬性名稱是一個形容詞,忽略屬性名稱的“is”首碼是允許的,但需要為訪問器指定約定的方法名,比如: @property (assign, getter=isEditable) BOOL editable; 單例 應該使用安全執行緒的模式建立共用的單例執行個體。

+ (instancetype)sharedInstance {

static id sharedInstance = nil;

 

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

sharedInstance = [[self alloc] init];

});

 

return sharedInstance;

}

附錄 Xcode主題 大部分的開發人員都使用Xcode預設的字型顏色主題,其實好的主題不僅能提高原始碼的辨識度,同時也增添了編碼的樂趣。  程式碼片段 熟練使用程式碼片段庫可以提高編碼的速度。Xcode4中,開啟一個項目並讓右側編輯區可視,然後點擊右側底部面板的第四個{}表徵圖,開啟程式碼片段庫,你可以將常用的代碼拖入其中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.