Подтвердить что ты не робот

Авто Бокс примитивов

Я не могу понять, как получить Objective-c для автоматической установки моих примитивов.

Я предположил, что я мог бы сделать следующее

float foo = 12.5f;
NSNumber* bar;

bar = foo;

Однако я обнаружил, что я использовал более подробный метод

float foo = 12.5f;
NSNumber* bar;

bar = [NSNumber numberWithFloat:foo];

Я делаю это неправильно или это так хорошо, как получается?

4b9b3361

Ответ 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