Атрибут enum с поддержкой enum в сущности Core Data имеет неправильное значение при передаче в функцию миграции модели в пользовательской политике миграции - PullRequest
0 голосов
/ 04 сентября 2018

Я выполняю миграцию модели Core Data; в моей пользовательской функции политики модели отображения одно из переданных значений атрибута передано неверно. Почему это?

Справочная информация:

Сущность My Core Data Book имеет атрибут readState, который имеет тип Integer16. Класс, соответствующий этому объекту, представляет этот атрибут как имеющий тип enum (другие атрибуты удалены для ясности):

@objc(Book)
class Book: NSManagedObject {
    @NSManaged var readState: BookReadState
}

@objc enum BookReadState: Int16 {
    case reading = 1
    case toRead = 2
    case finished = 3
}

Это всегда ведет себя так, как и ожидалось в этом приложении.

Положение:

Я выполняю миграцию между двумя версиями модели. Две версии не касаются readState. Сопоставление сущностей для сущности Book имеет сопоставление атрибутов (для некоторых других атрибутов), определяемое следующим выражением значения:

FUNCTION($entityPolicy, "currentPageForCurrentPage:readState:", $source.currentPage, $source.readState)

Мое сопоставление сущностей имеет собственный класс политики, как показано ниже:

class BookMapping_12_13: NSEntityMigrationPolicy {

    @objc func currentPage(forCurrentPage currentPage: NSNumber?, readState: Int16) -> NSNumber? {
        // function implementation here
    }
}

Проблема:

Когда эта миграция выполняется для объекта Book с атрибутом readState, равным .reading (например, 1), функция передает значение 17 для readState!

Debug screenshot showing readState equal to 17

Почему это? Есть ли какая-то странность в том, как перечисления хранятся в Базовых данных? Я рад предоставить более подробную информацию, если требуется.

1 Ответ

0 голосов
/ 04 сентября 2018

Подпись функции отображения сущности должна использовать NSNumber, а не Int16. E.g.:

@objc func currentPage(forCurrentPage currentPage: NSNumber?, readState: NSNumber) -> NSNumber?

Тогда readState правильно передается как 1. Я не понимаю почему.

...