получите тип NSNumber

Я хочу получить тип экземпляра NSNumber.

Я узнал на http://www.cocoadev.com/index.pl?NSNumber это:

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

 if ([[myNum className] isEqualToString:@"NSCFNumber"]) {
  // process NSNumber as integer
 } else if  ([[myNum className] isEqualToString:@"NSCFBoolean"]) {
  // process NSNumber as boolean
 }

Хорошо, но это не работает, [myNum имя класса] не распознан компилятором. Я компилирую для iPhone.

36
задан okami 25 March 2010 в 19:34
поделиться

4 ответа

Я рекомендую использовать метод - [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 .

77
ответ дан 27 November 2019 в 05:08
поделиться
NSString *classString = NSStringFromClass([myNum class]);

Это должно привести к строке, которую вы хотеть.

3
ответ дан 27 November 2019 в 05:08
поделиться

Причина, по которой компилятор предупреждает вас и это не работает, заключается в том, что -[NSObject className] объявлен в категории NSObject в Mac OS X (в NSScriptClassDescription.h) и не объявлен в iPhone. (Он не поддерживает AppleScript, очевидно.) NSStringFromClass([myNum class]) - это то, что вы должны использовать, чтобы быть в безопасности на всех платформах. Скорее всего, -className объявлен как простая обертка вокруг NSStringFromClass() в любом случае...

4
ответ дан 27 November 2019 в 05:08
поделиться

NSNumber явно не гарантирует, что возвращаемый тип будет соответствовать методу, использованному для его создания, поэтому делать это вообще, вероятно, плохая идея.

Однако вы, вероятно, могли бы сделать что-то вроде этого (вы также можете сравнить с objc_getClass ("NSCFNumber") и т. Д., Но это, возможно, более переносимо):

Class boolClass = [[NSNumber numberWithBool:YES] class];
/* ... */
if([myNum isKindOfClass:boolClass]) {
  /* ... */
}
9
ответ дан 27 November 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: