先日、以下のような記事を書いた。
Objective-Cで空文字列のチェック iOS
ざっくりといえば、Objective-Cの言語仕様上、nilに対するメッセージ送信はnil(0)を返すので、空文字列チェックは以下でよいというものだ。
if ([someString length])
しかし、コメント欄にてカテゴリ拡張やStringUtils的な方がすっきりするのでは、というご意見をいただいた。ということで試してみた。
ちなみに今回はXCTestによるテストコード付き。
カテゴリ拡張バージョン
NSString+Additions.m
#import "NSString+Additions.h"
@implementation NSString (Additions)
- (BOOL)isNotEmpty {
return [self length] > 0;
}
@end
XCTest
- (void)test_Additions_isNotEmpty
{
NSString *string;
string = @"foo";
XCTAssertTrue ([string isNotEmpty], @"長さを持った文字列はTrueを返す");
string = @"";
XCTAssertFalse([string isNotEmpty], @"長さが0の文字列はFalseを返す");
string = nil;
XCTAssertFalse([string isNotEmpty], @"nilに対しては(言語仕様上)Falseを返す");
}
StringUtilsバージョン
StringUtils.m
#import "StringUtils.h"
@implementation StringUtils
+ (BOOL)isEmpty:(NSString*)string {
return string == nil || [string length] == 0;
}
+ (BOOL)isNotEmpty:(NSString*)string {
return ![StringUtils isEmpty:string];
}
@end
XCTest
- (void)test_StringUtils_isEmpty
{
XCTAssertFalse([StringUtils isEmpty:@"foo"]);
XCTAssertTrue ([StringUtils isEmpty:@""]);
XCTAssertTrue ([StringUtils isEmpty:nil]);
}
- (void)test_StringUtils_isNotEmpty
{
XCTAssertTrue ([StringUtils isNotEmpty:@"foo"]);
XCTAssertFalse([StringUtils isNotEmpty:@""]);
XCTAssertFalse([StringUtils isNotEmpty:nil]);
}
感想
個人的には、StringUtils的なクラスを作ったほうが分かりやすいと感じた。
nilに対するメッセージ送信結果がnil(0)であるという言語仕様上、
カテゴリ拡張バージョンは、isEmptyを提供できないのが非常に歯がゆい。