2017-02-14 21 views
0

Приложение My Swift 3 использует CoreData. Поскольку переход на Swift3/Xcode 8, я отказался от автоматической генерации кода для подклассов NSManagedObject (Новое поведение, я до сих пор еще не совсем понял), поэтому я просто указываю non/manual и создаю свои собственные классы. Все идет нормально.Управляемое свойство типа NSNumber? не инициализирован до нуля

Я храню все мои скаляры атрибуты NSNumber? свойств, а не дополнительные скалярные типы, как Int?, Double? и т.д. (я не уверен, что, если дополнительные скалярные свойства хорошо работать с Core Data ...?).

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

К примеру, у меня есть:

class MyClass: NSManagedObject { 

    // Stores a double 
    @NSManaged var length: NSNumber? 
} 

Всякий раз, когда я пытаюсь получить доступ к значению, я никогда не nil, но 0.0 вместо:

if let value = myObject.length?.doubleValue { 
    // Always gets executes and value 0.0 is unwrapped 
    // for new objects 
} else { 
    // Never gets executed 
} 

Однако, если я вручную установить его к нолю при вставке экземпляра, то есть:

override awakeFromInsert(){ 

    super.awakeFromInsert() 

    // Explicitly set to nil: 
    self.length = nil 
} 

... тогда я получаю ожидаемое поведение.

Я что-то пропустил?

Я предполагаю, что атрибут @NSManaged делает его по-разному отличным от необязательного свойства run-of-the-mill swift. Но я не могу найти упоминания об этом поведении в любом месте.

+1

является собственностью nullable? – Sulthan

+2

Вы указали * значение по умолчанию * для свойства в контролере модели Core Data? –

+0

О, да. Несмотря на то, что я вручную генерирую код с использованием NSNumber, установлен флажок «Использовать тип Scalar», а значение по умолчанию равно нулю! : 0 –

ответ

2

Я согласен с Арун, что вам нужно выбрать тип (на самом деле, вы должны получить сообщение об ошибке, если вы этого не сделаете).

Что касается вашей проблемы, то по умолчанию CoreData добавляет значения по умолчанию для числовых полей. Вы можете, однако направить его не установить значение по умолчанию с помощью инспектора модели данных, как показано ниже:

Data Model Inspector in Xcode

Если отключить по умолчанию и оставьте поле пустым, при создании новой записи , убедитесь, что флажок Опция также отмечен флажком (это несколько строк выше установленного по умолчанию).

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

+0

I * am * выбор типа (Integer16, Double и т. Д.). Я просто использую NSNumber в своих определениях классов. Не уверены в альтернативах; Я открыт для идей (unboxing NSNumber везде становится громоздким) –

0

Вы не можете выбрать NSNumber в качестве типа данных при выборе класса core-data .xcmodel. Когда вы создаете атрибут, вы определяете значение по умолчанию. Ниже приведен снимок экрана, в котором упоминается тип значения по умолчанию. Итак, если вы хотите, чтобы значение в качестве двойного значения выбрано двойным как значение по умолчанию.

Создать управляемый класс из Xcode. Xcode-> Editor-> Создайте подклассу NSManagedObject. Вы автоматически генерируете классы.

enter image description here