0

私は辞書を持っています。次のように、その値の 1 つを抽出します。

NSString *magicValue= [filterDict valueForKey:[filterDict allKeys][0]];
[SomeClass foo: magicValue];

そして foo は次のとおりです。

- (void)foo:(NSString*)magicValue
{
    NSLog("magicValue is string:%@",[magic isKindOfClass:[NSString class]] ? @"YES" : @"NO");
    NSLog("magicValue is number:%@",[magic isKindOfClass:[NSNumber class]] ? @"YES" : @"NO");
}

辞書の値が数値の場合、magicValue は になりますNSNumber。したがって、定義された文字列ポインターはNSNumber. ログは、番号チェックに対して yes を返します。

クラス「magicValue」が何であるかを確認するために、そのようなメソッドに保護を追加したことはありません。文字列パラメーターでメソッドを定義すると、文字列になると想定しました。

そのような振る舞いを説明し始めて、常にチェックを追加する必要がありますか、それともそのような方法でその辞書の値を魔法に割り当てて私の方法を使用した人のせいですか. ベストプラクティスのアドバイスと、これを処理する方法が必要です。

この質問はすでに回答されている可能性がありますが、検索方法がわかりませんでした。

4

2 に答える 2

1

ほとんどの場合、参照しているクラス、または少なくともそれが何を意図しているかを知っている必要があります。送信するメッセージに応じてクラッシュを引き起こす可能性のある uexpected クラスがある場合は、コードをデバッグして正しい参照を取得できます。

通常、継承を扱うとき、コンパイル時ではなく実行時にクラスを決定する必要がある場合があります。こんな時、isKindOfClass:役に立ちます。値が多くのクラスの 1 つになる可能性があることがわかっている場合は、それを として抽出idし、最後の瞬間にキャストします。

id value = [[NSUserDefaults standardUserDefaults] valueForKey:aKey];
if ([value isKindOfClass:[MyClass class]]) {
    // Do one thing
}
else {
    // Do another
}
于 2015-04-29T08:32:28.840 に答える