2015-07-04 3 views
0

Запуск следующего кода прерывается в обратной линииОсновные данные NSManagedObject с XCode обратное приведение 7 и Swift

Type is not Workout 
Could not cast value of type 
'NSManagedObject_Workout_' (0x7fcca20620f0) to 
'AppName.Workout' (0x100ea5f40)). 

Часть внутри, если позволить ... никогда не выполняется.

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) 

} 

Я имел эту проблему в прошлом, и я решил его в XCode 6.x, перейдя в инспекторе объекта и настройки Class = AppName.Workout

Один из нескольких ответов, что предполагает, что это решение How come I can cast to NSManagedObject but not to my entity's type?

XCode 7 добавляет новый поворот к этой проблеме: Когда я установил

Class = AppName.Workout 

я п лицо инспектор, XCode 7 изменяет имя класса автомагический в

Class = AppNameWorkout 

удаления точки между AppName и ClassName.

Как я могу это сделать в XCode 7, когда я не могу установить точку между AppName и ClassName?

+0

Создание хорошего старого кода Objective-C для подкласса NSManagedObject и заголовка моста дает тот же результат. –

ответ

5

Перейдите в свою cdatamodel .., где вы указали свою сущность. У объекта есть настройка по умолчанию. Проверьте столбец «Класс» против вашего объекта. По умолчанию это будет префикс. Удалите префикс точки. И он должен работать. И из того, что я вижу, вам не нужно приписывать имя класса сущности имени модуля в Xcode 7. Следовательно, вы не можете использовать точку в имени класса. Я новичок в разработке iOS. Так что я не совсем прав. Но удаление префикса dot решило мою проблему в Xcode 7.

+0

Проделал некоторые тесты, и он работает для меня в самом приложении и в целевой тестовой программе Unit, где я импортирую основное приложение, включая основные классы данных. Благодаря :-) –

0

Вам нужно два исправления: Во-первых: Задайте имя класса сущности в качестве имени вашего объекта. Например:

Entity name = Entity 
Class name = Entity 

Второй: добавьте этот код выше вашего объекта класса файла:

@obj(Entity name) 

Например:

@obj(Entity) 
Class Entity: NSManagedObject { 
        ... 
} 
0

Сочетание этих решений и связь вы при условии, у меня к решению, но мне потребовалось некоторое время, чтобы собрать все это вместе. Это то, что я придумал (и это было в основном только надзор):

  1. Нажмите на .xcdatamodelId файла в вашей файловой структуры/проекта штурмана панели (слева).
  2. Выберите объект, с которым у вас возникли проблемы.
  3. На панели «Утилиты» (справа) найдите значок, похожий на сотовый телефон 1997 года, инспектор модели данных.
  4. В настройках сущности вы должны увидеть два поля: «Имя» и «Класс» - настроить «Класс» с именем используемого вами класса (как правило, таким же, как «Имя»).

То, где я перепутался, хотя все мои другие сущности имели этот набор, я забыл установить это на этой конкретной сущности.Вы даже заметите, прежде чем следовать этим шагам, что по умолчанию «класс» представляет собой NSObject, отражающий сообщение об ошибке. Некоторые из других решений здесь, вероятно, в конечном итоге делают то же самое, но я нашел это самым простым/быстрым решением.

Следует отметить, что у меня уже были некоторые другие отмеченные элементы, такие как ссылка на совместимость @objc (Entity).

Смежные вопросы