Авто Бокс примитивов
Я не могу понять, как получить Objective-c для автоматической установки моих примитивов.
Я предположил, что я мог бы сделать следующее
float foo = 12.5f;
NSNumber* bar;
bar = foo;
Однако я обнаружил, что я использовал более подробный метод
float foo = 12.5f;
NSNumber* bar;
bar = [NSNumber numberWithFloat:foo];
Я делаю это неправильно или это так хорошо, как получается?
Ответы
Ответ 1
К сожалению, Objective-C не выполняет автоматическое боксирование или распаковку примитивных типов до NSNumber
. Когда это делается, может быть понятно, почему: Objective-C не имеет понятия NSNumber
, класса в структуре Cocoa Foundation. В качестве небольшого надмножества C, Objective-C не имеет "родной" тип числового объекта - только родные типы C.
Изменить август 2012
Начиная с Xcode 4.4 (и LLVM 4.0), теперь вы можете использовать некоторый синтаксический сахар для обертывания чисел. Следуя вашему примеру, эти "бокс-выражения" теперь работают:
float foo = 12.5f;
NSNumber* bar;
bar = @(foo);
bar = @12.5f;
Ответ 2
Clang 3.1 и Apple LLVM 4.0 (включены в Xcode 4.4) поддерживают новую функцию бокса: http://clang.llvm.org/docs/ObjectiveCLiterals.html#objc_boxed_expressions
Теперь вы можете написать:
NSNumber *bar = @(foo);
а также:
NSNumber *bar = @12.5F;
Так получилось немного лучше.:)
Ответ 3
Автоматическая распаковка возможна в Objective c...
Пожалуйста, прочитайте следующий код
@interface Class1 : NSObject
@property(nonatomic,assign)int intval;
@end
///Теперь мы собираемся создать экземпляр класса 1 в классе2, и мы собираемся присвоить переменной экземпляра значение через отражение
@implementation Class2
-(void)TestClass1
{
Class1 *clsObj=[[Class1 alloc]init];
[clsObj setValue:@"3" forKey:@"intval"];
NSLog(@"%d",clsObj.intval);
}
@end
Если вы запустите вышеуказанный код, вы получите значение 3... Ошибка отсутствует
[clsObj setValue:@"3" forKey:@"intval"];
В intVal задано строковое значение 3 и оно автоматически распаковывается для назначения в качестве типа int переменной экземпляра intVal