Я выполняю миграцию модели 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
!
Почему это? Есть ли какая-то странность в том, как перечисления хранятся в Базовых данных? Я рад предоставить более подробную информацию, если требуется.