そのため、実行時までargのクラスタイプが不明なもので遊んでいました。このような:
- (NSNumber *)doWhatever:(id)arg
{
// this ALWAYS FAILS
if ([arg isKindOfClass:[NSNumber class]]) {
return arg;
}
else {
// what was it???
NSLog("arg klass=%@", [arg class]); // prints NSCFNumber
}
// This check works correctly.
if ([arg isKindOfClass:[NSArray class]]) {
for (id x in arg) {
NSNumber *result = [self doWhatever:x];
if (result) {
return result;
}
}
}
return nil;
}
- (void)someMethod
{
NSArray *myArray = [NSArray arrayFromObjects:[NSNumber numberWithInt:3], nil]];
NSNumber *myNum = [self doWhatever:myArray];
NSLog(@"myNum=%@", myNum);
}
これは明らかに私がやろうとしていることの不自然な例です。重要なのは、これは決して機能しないということです。「arg」のクラスは常にNSCFNumberとして表示され、それを確認する方法がわかりません。
配列内の任意の値が整数であるかどうかを検出する際の混乱を少なくする方法はありますか?
更新: @ chuck、@ omz、@NikitaLeonovにご協力いただきありがとうございます。私が最初にここに投稿したのは、私が抱えていた問題を単純化したものであり、最初に実行せずにここに記述しました。エラーを削除するために更新されたコード(以下を参照)は、実際には正常に実行されます。
私が問題を抱えていた実際のコードで犯した間違いも同様にばかげていました。配列のインデックスにある項目ではなく、配列を「doWhatever」に戻していたため、問題が発生していました。
助けてくれてありがとう、しかし私の質問は間違っていました。みんなの時間を無駄にしてすみません!
必要に応じて実行される修正されたコード:
- (NSNumber *)doWhatever:(id)arg
{
// this NOW WORKS
if ([arg isKindOfClass:[NSNumber class]]) {
return arg;
}
else {
// what was it???
NSLog(@"arg klass=%@", [arg class]); // prints NSCFNumber
}
// This check works correctly.
if ([arg isKindOfClass:[NSArray class]]) {
for (id x in arg) {
NSNumber *result = [self doWhatever:x];
if (result) {
return result;
}
}
}
return nil;
}
- (void)someMethod
{
NSArray *myArray = [NSArray arrayWithObjects:
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:4],
nil];
NSNumber *myNum = [self doWhatever:myArray];
NSLog(@"myNum=%@", myNum);
}