Авто Бокс примитивов - PullRequest
       6

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

16 голосов
/ 19 марта 2010

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

Я предполагал, что смогу сделать следующее

float foo = 12.5f;
NSNumber* bar;

bar = foo;

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

float foo = 12.5f;
NSNumber* bar;

bar = [NSNumber numberWithFloat:foo];

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

Ответы [ 3 ]

28 голосов
/ 19 марта 2010

К сожалению, 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;
10 голосов
/ 12 июня 2012

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;

Так что стало немного лучше. :)

0 голосов
/ 16 июля 2013

Автоматическая распаковка возможна в Objective c ...

Пожалуйста, прочитайте следующий код

@interface Class1 : NSObject
@property(nonatomic,assign)int intval;
@end 

/// Теперь мы собираемся создать экземпляр class1 в class2 и присвоим переменной экземпляра значение посредством отражения

@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

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