私はJava→Objective-Cの順で学んだプログラマなのだが、
Objective-Cにおいて、以下のように空文字列チェックをしていた。
#define IS_EMPTY(s) ((s == nil) || ([s length] == 0))
NSString *emptyString = @"";
NSString *nilString = nil;
NSString *someString = @"foo";
// nilまたは空文字列でないかチェックする
NSLog(@"%@", !IS_EMPTY(emptyString) ? @"YES" : @"NO");
NSLog(@"%@", !IS_EMPTY(nilString) ? @"YES" : @"NO");
NSLog(@"%@", !IS_EMPTY(someString) ? @"YES" : @"NO");
しかし
- C言語およびObjective-Cにおいて、0が「偽」で、0以外が「真」である
- nilに対するメッセージ送信結果はnil(数値を返す場合には0)が返却される
ことを考慮すると、どうやら以下がスマートな書き方らしい。
// nilまたは空文字列でないかチェックする
NSLog(@"%@", [emptyString length] ? @"YES" : @"NO");
NSLog(@"%@", [nilString length] ? @"YES" : @"NO");
NSLog(@"%@", [someString length] ? @"YES" : @"NO");
これは慣れるまでは読みづらい気がするが、
少なくともnilチェックと混在したコードよりはスッキリしているように思える。
// 明示的なnilおよび長さチェック
if (someString != nil && [someString length] > 0)
// 言語仕様を活かしたチェック
if ([someString length])
どちらが良いかは議論が分かれる部分はあると思う。
しかし、(チームで開発するのであれば)どちらに統一するかコーディング規約があるほうが良い気がする。