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]; if([number isKindOfClass:[NSNumber class]]){ NSLog(@ "NSNumebr"); } –

+1

"someMethod to os"のように配列の初期化をチェックしたところ、isKindOfClassの呼び出しでもうまく動作します –

+1

実際にこのコードを使いましたか? 'arrayFromObjects:'メソッドはありません、 'arrayWithObjects:'それは、 'NSCFNumber'の代わりに' NSCFArray'(または同様のもの)を動作させて印刷する必要があります。 – omz

答えて

10

NSCFNumberはのNSNumberのサブクラスです。あなたがisMemberOfClass:または[arg class] == [NSNumber class]ではなくisKindOfClass:を使用している限り、それは動作するはずです。そうでない場合、問題は他の場所にあります。

関連する問題