Я хочу получить тип экземпляра 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.
Я рекомендую использовать метод - [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 .
NSString *classString = NSStringFromClass([myNum class]);
Это должно привести к строке, которую вы хотеть.
Причина, по которой компилятор предупреждает вас и это не работает, заключается в том, что -[NSObject className]
объявлен в категории NSObject в Mac OS X (в NSScriptClassDescription.h) и не объявлен в iPhone. (Он не поддерживает AppleScript, очевидно.) NSStringFromClass([myNum class])
- это то, что вы должны использовать, чтобы быть в безопасности на всех платформах. Скорее всего, -className
объявлен как простая обертка вокруг NSStringFromClass()
в любом случае...
NSNumber явно не гарантирует, что возвращаемый тип будет соответствовать методу, использованному для его создания, поэтому делать это вообще, вероятно, плохая идея.
Однако вы, вероятно, могли бы сделать что-то вроде этого (вы также можете сравнить с objc_getClass ("NSCFNumber")
и т. Д., Но это, возможно, более переносимо):
Class boolClass = [[NSNumber numberWithBool:YES] class];
/* ... */
if([myNum isKindOfClass:boolClass]) {
/* ... */
}