当传递给自定义迁移策略中的模型迁移函数时,核心数据实体中的 Int16 支持的枚举属性似乎具有不正确的值

Int16 backed enum attribute in Core Data entity appears to have incorrect value when passed to a model migration function in a custom migration policy

我正在执行核心数据模型迁移;在我的映射模型自定义策略函数中,传递的属性值之一不正确。这是为什么?

背景:

我的核心数据实体 Book 有一个属性 readState,其类型为 Integer16。与此实体对应的 class 将此属性表示为具有枚举类型(为清楚起见删除了其他属性):

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

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

在此应用程序中,这始终符合预期。

情况:

我正在执行两个模型版本之间的迁移。两个版本不碰readStateBook 实体的实体映射具有由以下值表达式指定的属性映射(对于某些其他属性):

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

我的实体映射有自定义策略class,如下:

class BookMapping_12_13: NSEntityMigrationPolicy {

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

问题:

当在 readState 属性等于 .readingBook 实体上执行此迁移时(例如 1),函数传递值 17 readState

这是为什么?枚举存储在 Core Data 中的方式是否有些奇怪?如果需要,我很乐意提供更多详细信息。

实体映射函数签名必须使用NSNumber,而不是Int16。例如:

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

然后 readState 被正确传递为 1。我不明白为什么。