在自定义迁移策略中传递给模型迁移功能时,Core Data实体中的Int16支持的枚举属性似乎值不正确

时间:2018-09-04 18:53:17

标签: ios swift core-data core-data-migration

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

背景

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

@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 BookMapping_12_13: NSEntityMigrationPolicy {

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

问题:

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

Debug screenshot showing readState equal to 17

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

1 个答案:

答案 0 :(得分:0)

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

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

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