読者です 読者をやめる 読者になる 読者になる

hachinoBlog

hachinobuのエンジニアライフ

nilは0だからBOOL判定時とかに使用する場合は注意が必要って話

NSStringクラスのカテゴリを作成し該当の文字列が空かどうか判定するisEmptyメソッドを作った。

- (BOOL)isEmpty
{
    if (self.length > 0u) {
        return NO;
    }
    return YES;
}

上記メソッドを使用して空文字である場合と空文字でない場合の処理を下記のように分岐して書いていた。

//target変数にはDBやらどこかから入手した何かしらの文字が入っているという前提
if ([target isEmpty]) {
    //空文字だった場合の処理
    NSLog(@"Empty");
    return;
}
//空文字でなかった場合の処理
NSLog(@"Not Empty");

この処理の際に対象となるNSStringクラスの文字がnilであった場合、空文字として判定してほしかったのだが、上記の書き方だと空文字でないNot Emptyが表示されてしまう。
原因としては、そもそもnilに対してメソッドを呼んだところで無視されるのでisEmptyメソッドは呼ばれない。
nilは0を返すので

if (nil) {
    NSLog(@"A");
    return;
}
NSLog(@"B");

上記の場合、必ずBが表示される。
なのでisEmptyメソッドをisNotEmptyメソッドという名前に変えて、処理も下記の通りにした。

- (BOOL)isNotEmpty
{
    if (self.length > 0u) {
        return YES;
    }
    return NO;
}

こうすることで対象となる文字がnilであった場合でも適切な分岐が行える。

NSString *target = nil;
if ([target isNotEmpty]) {
    //空文字でなかった場合の処理
    NSLog(@"Not Empty");
    return;
}
//空文字だった場合の処理
NSLog(@"Empty");

表示されるのはEmpty。
nilの特性をきちんと理解してメソッドの設計をしないとだめですね。反省。