42

NSNumber インスタンスの型を取得したい。

私はhttp://www.cocoadev.com/index.pl?NSNumberでこれを見つけました:

NSNumber *myNum = [[NSNumber alloc] initWithBool:TRUE];

 if ([[myNum クラス名] isEqualToString:@"NSCFNumber"]) {
  // NSNumber を整数として処理します
 } そうでなければ ([[myNum className] isEqualToString:@"NSCFBoolean"]) {
  // NSNumber をブール値として処理します
 }

[myNum className] はコンパイラによって認識されません。私はiPhone用にコンパイルしています。

4

12 に答える 12

75

メソッドを使用することをお勧めし-[NSNumber objCType]ます。

これにより、次のことが可能になります。

NSNumber * n = [NSNumber numberWithBool:YES];
if (strcmp([n objCType], @encode(BOOL)) == 0) {
    NSLog(@"this is a bool");
} else if (strcmp([n objCType], @encode(int)) == 0) {
    NSLog(@"this is an int");
}

型エンコーディングの詳細については、Objective-C ランタイム リファレンスを参照してください。

于 2010-03-25T19:42:07.060 に答える
49

この方法で型を取得できます。文字列の比較は必要ありません。

CFNumberType numberType = CFNumberGetType((CFNumberRef)someNSNumber);

numberType は次のいずれかになります。

enum CFNumberType {
   kCFNumberSInt8Type = 1,
   kCFNumberSInt16Type = 2,
   kCFNumberSInt32Type = 3,
   kCFNumberSInt64Type = 4,
   kCFNumberFloat32Type = 5,
   kCFNumberFloat64Type = 6,
   kCFNumberCharType = 7,
   kCFNumberShortType = 8,
   kCFNumberIntType = 9,
   kCFNumberLongType = 10,
   kCFNumberLongLongType = 11,
   kCFNumberFloatType = 12,
   kCFNumberDoubleType = 13,
   kCFNumberCFIndexType = 14,
   kCFNumberNSIntegerType = 15,
   kCFNumberCGFloatType = 16,
   kCFNumberMaxType = 16
};
typedef enum CFNumberType CFNumberType;
于 2011-10-13T00:27:32.947 に答える
30

ブール値とそれ以外のものを区別することだけが必要な場合は、ブール値の NSNumbers が常に共有インスタンスを返すという事実を利用できます。

NSNumber *num = ...;
if (num == (void*)kCFBooleanFalse || num == (void*)kCFBooleanTrue) {
   // num is boolean
} else {
   // num is not boolean
}
于 2013-04-30T09:38:27.407 に答える
9

NSNumberは、返された型がそれを作成するために使用されたメソッドと一致することを明示的に保証しないため、これを行うことはおそらく悪い考えです。

ただし、おそらく次のようなことを行うことができます(objc_getClass("NSCFNumber")etcと比較することもできますが、これは間違いなくより移植性があります)。

Class boolClass = [[NSNumber numberWithBool:YES] class];
/* ... */
if([myNum isKindOfClass:boolClass]) {
  /* ... */
}
于 2010-03-27T03:55:44.527 に答える
5

スウィフトの場合:

let numberType = CFNumberGetType(answer)

switch numberType {
case .charType:
    //Bool
case .sInt8Type, .sInt16Type, .sInt32Type, .sInt64Type, .shortType, .intType, .longType, .longLongType, .cfIndexType, .nsIntegerType:
    //Int
case .float32Type, .float64Type, .floatType, .doubleType, .cgFloatType:
    //Double
}
于 2016-12-06T16:17:01.793 に答える
5

メソッド-[NSNumber objCType] methodを使用して型を取得します。

型が @encode(BOOL) と等しい場合、または数値自体が kCFBooleanFalse または kCFBooleanTrue の場合、ブール値です。

'c' 以外の場合は、数値です。

'c' の場合、サポートされている唯一の方法と思われる方法は、プライベート クラス名をチェックしたり、文書化されていないシングルトンと比較したりせずに、1 つの要素である数値の配列を作成し、NSJSONSerialization を使用して文字列を取得することです。表現。最後に、文字列表現に文字列「true」または「false」が含まれているかどうかを確認します。NSNumber が BOOL かどうかを確認するための完全なコードは次のとおりです。

-(BOOL)isBool
{
    if(!strcmp(self.objCType, @encode(BOOL)) ||
        self == (void*)kCFBooleanFalse ||
        self == (void*)kCFBooleanTrue)
    {
        return YES;
    }

    if(strcmp(self.objCType, "c"))
    {
        return NO;
    }

    NSString * asString = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:@[self] options:kNilOptions error:nil] encoding:NSUTF8StringEncoding];

    return [asString containsString:@"true"] || [asString containsString:@"false"];
}

NSJSONSerialization の使用は遅く、@NO/@YES が常に kCFBooleanFalse/kCFBooleanTrue に等しくなるのを停止する場合、このメソッドはタイト ループで使用しないでください。

于 2015-12-14T14:05:07.963 に答える
4

コンパイラが警告し、それが機能しない理由-[NSObject className]は、Mac OS X の NSObject のカテゴリ (NSScriptClassDescription.h 内) で宣言され、iPhone では宣言されていないためです。(明らかに AppleScript をサポートしていません。)NSStringFromClass([myNum class])すべてのプラットフォームで安全に使用する必要があります。とにかく-className単純なラッパーとして宣言されている可能性があります...NSStringFromClass()

于 2010-03-25T19:48:57.290 に答える
3
NSString *classString = NSStringFromClass([myNum class]);

これで、必要な文字列が得られるはずです。

于 2010-03-25T19:36:25.107 に答える
0

NSNumber に bool 値が含まれていることを確認するには、次のようにします。

if (strcmp([myNumber objCType], [@(YES) objCType]) == 0)
NSLog(@"%@", [myNumber boolValue] ? @"true" : @"false");
于 2016-08-27T06:19:42.120 に答える
-2

チェック オブジェクトは NSNumber タイプです:

if([obj isKindOfClass:NSClassFromString(@"__NSCFNumber")]) { //NSNumber }

于 2014-02-26T11:33:26.847 に答える