私はiPhoneでアプリケーションを作成しています。このアプリケーションは、AndroidとiPhoneの両方で同様に機能する必要があるため、記述されたコードとJavaを使用してObjective-Cに変換しています。もちろん問題は、言語がかなり異なり、適切に実装するのが難しい特定の領域があることです。
もちろん異なる領域の1つは、特定のタイプのオブジェクトのみを受け入れるNSMutableArraysまたはNSMutableDictionariesを作成できないことです。したがって、これらのオブジェクトのゲッターとセッターを作成するときは、次の例でこれを行っています。
-(void)setPerson:(NSMutableArray *)personList_p
{
BOOL bAllowed = YES;
for(int i = 0; i < [personList_p count]; i++)
{
if(![[personList_p objectAtIndex:i] isKindOfClass:[Person class]])
{
bAllowed = NO;
break;
}
else
{
bAllowed = YES;
}
}
if(bAllowed)
{
personList_i = personList_p;
}
else
{
//Raise error here
}
}
以前はNSRaiseExceptionを使用していましたが、それを読んだ後、例外処理はリソースを大量に消費するため、このタイプの状況では使用しないことをお勧めします。だから私が読んだNSErrorは良い解決策だったので、私はこのガイドを読んでいました
http://www.cimgf.com/2008/04/04/cocoa-tutorial-using-nserror-to-great-effect/
私の質問は2つあります。NSErrorを使用することにした場合、メソッドでNSErrorオブジェクトを宣言するのがベストプラクティスです。つまり、次のようになります。
-(void)setPerson:(NSMutableArray *)personList_p : (NSError **)error
または、このように、上記のelseステートメント内でエラーを宣言するだけで大丈夫ですか?
NSError *error = nil;
NSMutableDictionary* details = [NSMutableDictionary dictionary];
[details setValue:@"Invalid object passed into Array, object must be of type Person." forKey:NSLocalizedDescriptionKey];
error = [NSError errorWithDomain:@"Invalid Object" code:200 userInfo:details];
NSLog(@"%@", [error localizedDescription]);
第二に、私が上でリンクしたガイドで、結論として著者は言います
この例では、メッセージ呼び出し後もエラーがまだゼロであるかどうかを確認しています。nilでなくなった場合は、エラーが発生したことを認識しており、ユーザーに表示する必要があります。Appleは、NSApplicationインスタンスでpresentError:を呼び出すことでこれを行うための組み込みメソッドを提供しています
彼はここでこのコード行を使用します
[NSApp presentError:error];
これは私には機能しません。このコードではオートコンプリートオプションを取得できません。宣言されていない識別子の使用を示しているだけです。ここで明らかな何かが欠けていますか?
また、念のために言っておきますが、私が使用している方法は、ユーザーが正しいオブジェクトタイプの配列を送信することを保証するための最良の方法ですか?または、同じことをより効率的に達成するために使用できる別の方法がありますか。
前もって感謝します!!
編集:
追加の質問ですが、NSErrorの問題はアプリが続行することであるため、NSExceptionを使用するのは非常に悪い考えです。無効なオブジェクトを含む配列を渡した場合、アプリケーションが発生するだけであるため、NSExceptionを使用することを検討しています。クラッシュして例外を発生させます。私がこれをすべきでない主な理由はありますか?