コードの構造について¶
if/for文は常に波括弧 {}
をつける¶
ifやfor等、波括弧 {}
を省略できるものがありますが、基本的に省略せずにかきましょう
// Bad!
if (something)
// do something
// Good!
if (something) {
// do something
}
Note
if (something) return;
というようにスグにreturnするだけの場合は省略しても悪くは無いが、
出来れば付けていたほうがよい。
比較は常に厳密に行う¶
NSStringを比較する場合 ==
で文字列を比較するのは避けるべきです。
==
による比較は文字列としての比較ではなく、同じポインタの値かどうかの比較になります。
文字列の比較を行う場合は isEqualToString:
メソッドを使い比較します。
/Code/Tests/CompareTests.m
#import <SenTestingKit/SenTestingKit.h>
#import <OCHamcrestIOS/OCHamcrestIOS.h>
@interface CompareTests : SenTestCase
@end
@implementation CompareTests
- (void)testEqual {
NSString *one = @"1";
NSString *eins = [NSString stringWithFormat:@"%c", '1'];
BOOL isEqualOperator = (one == eins);// ポインタ値は一致しない
assertThatBool(isEqualOperator, equalToBool(NO));
BOOL isEqualMethod = [one isEqualToString:eins];// 文字列的には一致する
assertThatBool(isEqualMethod, equalToBool(YES));
}
@end
- objective c - Why does NSString sometimes work with the equal sign? - Stack Overflow
- 文字列比較のお作法 - memory*Leak
Note
定義済みの文字列定数同士を ==
で比較した場合は問題無いですが、
それを考えて行うのは難しい所もあるので、基本的に文字列の比較はメソッドを使って行う方がよい。
一般にオブジェクト同士の値を比較する場合は適当な isEqual*:
や compare:
といったメソッドが用意されているはずなので、
それを利用し比較するべきです。(intやNSUInteger等のプリミティブな値はC言語と同様に ==
で比較して問題ありません)
See also
- Objective-Cによるプログラミング P40
- “オブジェクトの等価性を判断する” に
==
,isEqual:
,compare:
について書かれている。
真偽値の比較は省略する¶
BOOL型等の真偽値をif文等において比較するのは、あまり意味がなく冗長になるだけなので、 避けるべきです。
BOOL hasYES = YES;
// Bad!
if(hasYES == YES){ /* somthing */ }
// Good!
if(hasYES){ /* somthing */ }