LoginSignup
9
9

More than 5 years have passed since last update.

Objective-Cでカテゴリ拡張およびUtilクラスによる空文字列チェック

Posted at

先日、以下のような記事を書いた。
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を提供できないのが非常に歯がゆい。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9