woshidan's blog

あいとゆうきとITと、とっておきの話。

ObjCで戻り値以外にNSErrorのポインタを出しているのが面白かった話

NSErrorの使い方というよりはNSErrorが使われる場面についての話で、 C言語をはじめとした関数やメソッドの戻り値は基本的に1つになります。

複数の値を返したい場合、構造体を作ったり、オブジェクトを使ったり、といった方法がありますが、基本的にメソッドの戻り値は1つの値か、関連する値をまとめた一つのオブジェクト、となります。

普段はそこまでこまらないのですが、本来の処理と全然関係ない情報を呼び出し元に返したくなった場合はどうしたらよいでしょうか。例えば、エラーが起きてしまって本来の値が返せない、といった場合。

JavaRubyなら上記のような想定外の事態が起きて処理が進められない場合には例外を投げてしまえばいいのでしょうが、メモリ管理にARCを利用している関係もあり、Objective-Cでは基本的にアプリがそのまま死ぬような場合以外は例外を投げたくありません。

では、どうするか、と言いますと、例外を表すNSErrorのインスタンスのポインタを渡して、何か起きた時にはNSErrorのポインタがさす変数にnil以外が入っているようにするのです。

// 引用元: http://www.inazumatv.com/contents/archives/9078
NSError *error = nil;
NSString *result = [ExampleError exampleMethod:&error]
 
if (error) {
    // error処理
}

// class ExampleError
+(NSString *)exampleMethod:(NSError **)didFailWithError
{
    NSError *error = nil;
    NSString *resultMessage = @"success message";
 
    [self innerMethod:&error];
    if (error) {
        *didFailWithError = error;
        return nil;
    }
 
    return resultMessage;
}

というのが面白かった、というお話。

参考: