5

所以我玩的東西的類的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); 
} 
+1

你確定以這種方式構建數組嗎?我寫了下面的代碼,isKindOfClass在這種情況下效果很好: NSNumber * number = [NSNumber numberWithFloat:0.5]; ([number isKindOfClass:[NSNumber class]]){ NSLog(@「NSNumebr」); } –

+1

檢查數組的初始化如「someMethod to os」中所示,也可按照isKindOfClass調用的預期工作 –

+1

您真的使用了這個確切的代碼嗎?沒有'arrayFromObjects:'方法,它被稱爲'arrayWithObjects:'。它應該工作並打印'NSCFArray'(或類似的東西)而不是'NSCFNumber'。 – omz

回答

10

NSCFNumber是NSNumber的的一個子類。只要您使用isKindOfClass:而不是isMemberOfClass:[arg class] == [NSNumber class],它應該可以工作。如果不是,你的問題在別處。