所以我玩的東西的類的arg是未知的,直到運行時。 這樣的:參數isKindOfClass:[NSNumber類] - 理智的方法來檢查這個?
- (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);
}
這顯然是我想要做一個人爲的例子。 關鍵是這永遠不會工作b/c「arg」的類始終顯示爲NSCFNumber,我無法找出一種方法來檢查。
任何方式可以減少檢測數組中的任意值是否爲整數的混淆?
感謝, 傑米
UPDATE: 嗨,大家好。謝謝@chuck,@omz和@Nikita Leonov的幫助。我在這裏發佈的內容最初只是簡化了我所遇到的問題,而不是先運行它。該代碼一旦更新,以消除錯誤(見下文)實際上運行良好。
我在我的真實代碼中犯的錯誤同樣愚蠢 - 我將數組傳回給「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);
}
你確定以這種方式構建數組嗎?我寫了下面的代碼,isKindOfClass在這種情況下效果很好: NSNumber * number = [NSNumber numberWithFloat:0.5]; ([number isKindOfClass:[NSNumber class]]){ NSLog(@「NSNumebr」); } –
檢查數組的初始化如「someMethod to os」中所示,也可按照isKindOfClass調用的預期工作 –
您真的使用了這個確切的代碼嗎?沒有'arrayFromObjects:'方法,它被稱爲'arrayWithObjects:'。它應該工作並打印'NSCFArray'(或類似的東西)而不是'NSCFNumber'。 – omz