Objective-C編程中語句和變數的一些編寫規範建議_IOS

來源:互聯網
上載者:User

語句
條件陳述式

條件陳述式體應該總被大括弧包圍。只有一行代碼最好也加上,否則會帶來安全隱患。

複製代碼 代碼如下:

// 推薦
if (!error) {
    return success;
}

// 不推薦
if (!error)
    return success;

if (!error) return success;


尤達運算式(Yoda)

不要使用尤達運算式。(名字起源於星球大戰中尤達大師的講話方式,總是用倒裝的語序)

複製代碼 代碼如下:

// 推薦
if ([myValue isEqual:@42]) { ...

// 不推薦
if ([@42 isEqual:myValue]) { ...


nil和BOOL的檢查

一些人喜歡用這樣的方式來檢查nil:

複製代碼 代碼如下:

if (nil == myValue) { ...

這樣做可以避開少些一個"=“的錯誤,因為一旦少寫一個”=“,那麼nil是不能被賦值的,編譯器會報錯。

但是前面提到,最好不要使用尤達運算式。所以更好的解決方案是用”!”來完成nil和BOOL的檢查。

複製代碼 代碼如下:

// 推薦
if (someObject) { ...
if (![someObject boolValue]) { ...
if (!someObject) { ...

// 不推薦
if (someObject == YES) { ... // Wrong
if (myRawValue == YES) { ... // Never do this.
if ([someObject boolValue] == NO) { ...


不要嵌套多個if語句

不要嵌套多個if語句,而是使用多個return來避免增加複雜度,並提高代碼可讀性。

也就是說,在一個方法中,重要的部分盡量不要放在if語句中,而是將”其它情況”放在if中。

複製代碼 代碼如下:

// 推薦
- (void)someMethod {
  if (![someOther boolValue]) {
      return;
  }

  //Do something important
}

// 不推薦
- (void)someMethod {
  if ([someOther boolValue]) {
    //Do something important
  }
}


複雜的運算式

當一個判斷條件很複雜時,應該將它們提取出來賦值給一個BOOL變數。

複製代碼 代碼如下:

BOOL nameContainsSwift  = [sessionName containsString:@"Swift"];
BOOL isCurrentYear      = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession     = nameContainsSwift && isCurrentYear;

if (isSwiftSession) {
    // Do something very cool
}


三元運算子

三元運算子要保證可讀性。

複製代碼 代碼如下:

// 推薦
result = a > b ? x : y;

// 不推薦
result = a > b ? x = c > d ? c : d : y;


當三元運算子的第二個參數(if 分支)返回和條件陳述式中已經檢查的對象一樣的對象的時候,下面的表達方式更靈巧:
複製代碼 代碼如下:

// 推薦
result = object ? : [self createObject];

// 不推薦
result = object ? object : [self createObject];


錯誤處理

有些方法通通過參數返回 error 的引用,使用這樣的方法時應當檢查方法的傳回值,而非 error 的引用。

複製代碼 代碼如下:

// 推薦
NSError *error = nil;
if (![self trySomethingWithError:&error]) {
    // Handle Error
}

switch語句中的case,如果只有一行代碼可以不必加上大括弧,但是多行需要加上。
複製代碼 代碼如下:

switch (condition) {
    case 1:
        // ...
        break;
    case 2: {
        // ...
        // Multi-line example using braces
        break;
       }
    case 3:
        // ...
        break;
    default:
        // ...
        break;
}

枚舉類型

使用NS_ENUM()這個宏來定義枚舉,它有更強大的的類型檢查和代碼補全。

複製代碼 代碼如下:

typedef NS_ENUM(NSUInteger, ZOCMachineState) {
    ZOCMachineStateNone,
    ZOCMachineStateIdle,
    ZOCMachineStateRunning,
    ZOCMachineStatePaused
};

變數
盡量使用長的、描述性的方法和變數名。

複製代碼 代碼如下:

// 推薦
UIButton *settingsButton;

// 不推薦
UIButton *setBut;


常量應該以駝峰法命名,並以相關類名作為首碼。
複製代碼 代碼如下:

// 推薦
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;

// 不推薦
static const NSTimeInterval fadeOutTime = 0.4;


推薦使用常量來代替字串字面值和數字。可以方便複用,快速修改。

常量應該用static聲明為靜態常量,而不要用#define,除非它明確作為宏來使用。

複製代碼 代碼如下:

// 推薦
static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";

static const CGFloat ZOCImageThumbnailHeight = 50.0f;

// 不推薦
#define CompanyName @"Apple Inc."
#define magicNumber 42


常量如果需要暴露給外部,那麼要在標頭檔中以這樣的形式:
複製代碼 代碼如下:

extern NSString *const ZOCCacheControllerDidClearCacheNotification;

並在實現檔案中為它賦值。

只有公有的常量才需要添加命名空間作為首碼。儘管實現檔案中私人常量的命名可以遵循另外一種模式,你仍舊可以遵循這個規則。

方法名與方法類型(-/+符號)間應加上一個空格。

方法段間也應該以空格間隔。

參數前應該有一個描述性的關鍵詞。

儘可能少用”and”這個詞,它不應該用來闡明有多個參數。

複製代碼 代碼如下:

// 推薦
- (void)setExampleText:(NSString *)text image:(UIImage *)image;
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (id)viewWithTag:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;

// 不推薦
- (void)setT:(NSString *)text i:(UIImage *)image;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
- (id)taggedView:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;
- (instancetype)initWith:(int)width and:(int)height;  // Never do this.


使用字面值來建立不可變的NSString,NSDictionary,NSArray和NSNumber對象。

用這種方式,注意不要將nil放在NSArray和NSDictionary裡,這樣會導致崩潰。

複製代碼 代碼如下:

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];

避免這樣的方式建立可變數組:
複製代碼 代碼如下:

NSMutableArray *aMutableArray = [@[] mutableCopy];

這樣的方式,在效率和可讀性上都存在問題。

效率:一個不必要的不可變數組被建立後馬上被廢棄,並沒有必要。

可讀性:可讀性並不好。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.