iPhone: сохранить логическое значение в Core Data - PullRequest
53 голосов
/ 30 мая 2010

Я настроил один из основных атрибутов данных как логическое значение.Теперь мне нужно установить его, но XCode постоянно говорит мне, что он может не отвечать на setUseGPS.

[ride setUseGPS: useGPS.on];

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

Ответы [ 4 ]

133 голосов
/ 30 мая 2010

Базовые данные "не имеют" логического типа (он есть, но это NSNumber).

Таким образом, чтобы установить эквивалент useGPS = YES.

[entity setUseGPS:[NSNumber numberWithBool:YES]];

И наоборот:

BOOL isGPSOn = [[entity useGPS] boolValue];

Обновление: Как указывает SKG, с литералами в Objetive-C теперь вы можете сделать это проще:

[entity setUseGPS:@YES];

BOOL isGPSOn = entity.useGPS.boolValue;
18 голосов
/ 01 апреля 2011

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

@property (nonatomic) BOOL useGPS;   // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject

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

Если у вас есть числовой атрибут (включая логический атрибут) это требуется, вы можете просто ввести его как вместо этого скаляр правильная вещь:

@ свойство (неатомное) BOOL isDone;

Даже если атрибут необязательный, это все еще будет работать - это будет просто сопоставить «не присутствует» с «ложным».

и для более выверенной реализации Какао:

Еще одна вещь, которую вы могли бы сделать это имя свойства "сделано" и просто укажите получатель как «isDone». Это обычное соглашение об именовании Какао:

@ свойство (неатомное, getter = isDone) BOOL сделано;

Тогда вы можете написать "if (item.done) { ...} "или" item.done = NO; "и Компилятор по-прежнему будет генерировать -isDone для доступа к собственности.

Спасибо, Крис, и надеюсь, что это кому-нибудь поможет.

2 голосов
/ 04 октября 2018

Просто в дополнение к ответу @RickiG, способ создания NSNumber из Bool и наоборот в Swift (по крайней мере, начиная с версии 4.2):

let nsNumberFromBool = NSNumber(booleanLiteral: true) // or false
let boolFromNSNumber = nsNumberFromBool.boolValue
0 голосов
/ 16 июня 2010

«Исправить» для этого (ИМХО, это ошибка в SDK Apple) - добавить следующий код в класс, сгенерированный CoreData. NB: если вы делаете это в категории, в отдельном файле, вам не нужно повторно копировать / вставлять его каждый раз, когда вы воссоздаете классы CoreData внутри Xcode

- (BOOL)useGPS
{
    [self willAccessValueForKey:@"useGPS"];
    BOOL myuseGPS = [[self primitiveUseGPS] boolValue];
    [self didAccessValueForKey:@"useGPS"];
    return myuseGPS;
}

- (void)setUseGPS:(BOOL)newValue
{
    [self willChangeValueForKey:@"useGPS"];
    [self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]];
    [self didChangeValueForKey:@"useGPS"];
}
...