核心数据NSManagedObject使用XCode 7和Swift进行向下转换

Ger*_*tan 0 core-data swift xcode7

运行以下代码将在返回行中中止

Type is not Workout 
Could not cast value of type 
'NSManagedObject_Workout_' (0x7fcca20620f0) to 
'AppName.Workout' (0x100ea5f40)). 
Run Code Online (Sandbox Code Playgroud)

如果让...内部的部分永远不会执行.

func createWorkoutWithName (name: String) -> Workout? {
    let entityName = NSStringFromClass(Workout.classForCoder())
    let newEntity = NSEntityDescription.insertNewObjectForEntityForName(entityName, inManagedObjectContext: managedObjectContext)
    if let newEntity = newEntity as? Workout {
        newEntity.name = name
    }
    NSLog("createWorkoutWithName: Type is not Workout")
    return (newEntity as! Workout)

}
Run Code Online (Sandbox Code Playgroud)

我过去遇到过这个问题,我通过进入实体检查器并设置Class = AppName.Workout,在XCode 6.x中解决了这个问题.

建议这个解决方案的几个答案之一是 我怎么可以转换为NSManagedObject而不是我的实体的类型?

XCode 7为这个问题增添了新的变化:当我设置时

Class = AppName.Workout
Run Code Online (Sandbox Code Playgroud)

在实体检查器中,XCode 7自动将类名更改为

Class = AppNameWorkout
Run Code Online (Sandbox Code Playgroud)

通过删除AppName和ClassName之间的点.

那么当我无法在AppName和ClassName之间设置点时,如何在XCode 7中执行此操作?

小智 5

转到你宣布实体的地方的cdatamodel ..实体下面有一个默认配置.检查您的实体的Class列.默认情况下,这将有一个前缀点.删除点前缀.它应该工作.从我看到的是你不必在Xcode 7中为你的实体类名称加上模块名称.因此你不能在类名中使用点.我是iOS开发中的新手.所以我可能不完全正确.但删除点前缀解决了我在Xcode 7中的问题.