iOS5 Core Data и NSNumber есть автобокс / распаковка? - PullRequest
1 голос
/ 09 ноября 2011

Исходя из Java, я довольно привык к autoboxing , где int автоматически оборачивается в Integer, когда это необходимо, и Integer может быть распакован в примитив.Есть ли что-то похожее, на что я могу положиться в iOS5?

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

 number.intValue
 //or 
number.boolValue 

есть ли какой-нибудь способ использовать NSNumber непосредственно в уравнениях и тому подобное? например:

int x = 5+ nsNumberInstance;

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

managedObject.dynamicProperty = [NSNumber numberWithInt: int];

есть ли лучший способ изменить значение уже созданного NSNumber? Какие изящные ярлыки можно использовать, чтобы спасти себя от запястьятуннелю через 10 лет?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 01 января 2012

На самом деле, когда вы находитесь в своей модели данных и используете элемент меню «Создать подкласс NSManagedObject», есть опция, которую вы можете выбрать под названием «Использовать скалярные свойства для примитивных типов данных».

Это автоматически обрабатывает вас во многих случаях.
Вот несколько примеров:

BOOL:
@property (nonatomic, retain) NSNumber * aBool;
становится
@property (nonatomic) BOOL aBool;

NSDate:
@property (nonatomic, retain) NSDate * aDate;
становится
@property (nonatomic) NSTimeInterval aDate;

Целое число 32:
@property (nonatomic, retain) NSNumber * aNumber;
становится
@property (nonatomic) int32_t aNumber;

и

Float:
@property (nonatomic, retain) NSNumber * aFloat;
становится
@property (nonatomic) float aFloat;

NSDecimalNumber и NSString остаются прежними.

Вы можете изменить их самостоятельно в ранее сгенерированном заголовочном файле, если вы уже сгенерировали подклассы, и методы доступа автоматически обновятся без повторной генерации подкласса.

3 голосов
/ 09 ноября 2011

За исключением привязок Какао, я не могу вспомнить многих других мест, где есть автобокс скалярных типов в Какао или Какао, так что, к сожалению, вам не повезло.

Вы на самом деле не такполучить что-нибудь, работая с NSNumbers в вычислениях, поэтому работа с объектами там на самом деле не нужна.Гораздо проще работать со скалярными типами, а затем преобразовывать туда и обратно между номерами NSN при сохранении этих чисел в базовых данных, массивах и т. Д. Единственный случай, когда вы захотите остаться в этой форме, - это NSDecimalNumbers, которые не представляютчисла являются стандартными значениями с плавающей запятой и, таким образом, избегают сбоев, которые вы видите при попытке работать с десятичными числами в этих типах.

Базовые данные хранят объекты, поэтому вы не сможете обойти это на базовом уровне, но вы можете немного упростить свою жизнь, используя собственные методы доступа в подклассах NSManagedObject, которые принимают и возвращают скалярные значения.Apple имеет пример этого в разделе « Методы доступа к управляемым объектам » Руководства по программированию основных данных, где они показывают, как настроить метод доступа для значения CGFloat вместо использования NSNumber:

@interface Circle : NSManagedObject
{
    CGFloat radius;
}
@property CGFloat radius;
@end

@implementation Circle

- (CGFloat)radius
{
    [self willAccessValueForKey:@"radius"];
    float f = radius;
    [self didAccessValueForKey:@"radius"];
    return f;
}

- (void)setRadius:(CGFloat)newRadius
{
    [self willChangeValueForKey:@"radius"];
    radius = newRadius;
    [self didChangeValueForKey:@"radius"];
}
@end

В качестве примечания, использование синтаксиса точек для -intValue и -boolValue, хотя и работает, не рекомендуется.Это не свойства, а односторонние методы, которые извлекают значения из NSNumbers.При работе с ними используйте скобки, чтобы это было понятно в вашем коде.

...