Как получить доступ к классам Obj-C, сгенерированным Core Data, в тестовых целях?

У меня есть проект приложения Core Data/Swift Cocoa в Xcode 6 (назовем проект Stuff). Я создал объект Core Data с именем Query и использовал Xcode для создания для него подкласса NSManagedObject.

В этот момент Xcode 6 предложил мне создать связующий заголовок, как и ожидалось, и создал Stuff-Bridging-Header.h. Как только я #import "Query.h" в заголовке моста, мой объект модели Query становится доступным в моем целевом коде Swift приложения.

Как сделать этот объект Query Core Data (поддерживаемый сгенерированными Xcode Query.h и Query.m) доступным для моего тестового целевого кода Swift, StuffTests? Я попытался вручную создать файл заголовка StuffTests-Bridging-Header.h и добавить в него #import "Query.h", но мой тестовый класс Swift не смог разрешить класс Query.


person JefferyRPrice    schedule 15.06.2014    source источник
comment
Вы используете существующий код Objective-C или это новый проект «Swift»?   -  person GoZoner    schedule 16.06.2014


Ответы (3)


У меня есть проект с CoreData на чистом Swift, никакие заголовочные файлы мостов и тесты не работают. Вот как мне удалось это сделать:

Мой проект называется cars, и у меня есть NSManagedObject с именем Car.

Автомобиль.свифт:

Car.swift

Файл Car.swift Целевое членство:

Файл Car.swift Целевое членство:

cars.xcdatamodeld Инспектор модели данных:

cars.xcdatamodeld Инспектор модели данных

person Lucien    schedule 26.10.2014
comment
Имейте в виду: на данный момент Xcode 6.1 сильно спотыкается при создании подклассов с префиксом приложения, что затрудняет правильный метод. Вместо того, чтобы создавать подклассы ваших сущностей, он будет генерировать один класс с префиксом, поэтому вам нужно либо использовать obj(), либо создавать подклассы без прикрепленного префикса, а затем добавлять его в модель. - person Dandy; 28.10.2014
comment
У меня такая же структура, но в любом случае, когда я создаю объект и выполняю приведение, приведение не выполняется. Это работает: var object: AnyObject = NSEntityDescription.insertNewObjectForEntityForName("Photo", inManagedObjectContext: context), но тогда это терпит неудачу: var photo = object as Photo. - person pbernery; 10.01.2015
comment
Наконец-то мне удалось заставить его работать: метод NSEntityDescription.insertNewObjectForEntityForName не работает, но работает поиск объекта, а затем создание объекта. Первый шаг: let entity = NSEntityDescription.entityForName("Photo", inManagedObjectContext: context), затем photo = Photo(entity: entity!, insertIntoManagedObjectContext: context) - person pbernery; 10.01.2015

Вы можете использовать NSManagedObject непосредственно в Swift следующим образом:

class Query : NSManagedObject {
  @NSManaged var attrOne : attrOneType
  // ...
}

В настоящее время Xcode не будет генерировать код Swift для объекта; он по-прежнему генерирует только Objective-C, что может привести вас к промежуточному решению. Но вам не нужно соединять — просто начните с сгенерированного Objective-C и напишите код Swift с аннотацией @NSManaged.

person GoZoner    schedule 16.06.2014
comment
Я понимаю это, и меня устраивает сгенерированный код Obj-C. Импортируя Query.h в заголовок моста, мой NSManagedObject подкласс Query доступен в Swift, но только в моем целевом приложении. Я также хотел бы использовать его в своих тестах и ​​не могу понять, как этого добиться. - person JefferyRPrice; 16.06.2014
comment
У меня нет связующего заголовка в моем приложении, и основные данные работают. Но тесты с использованием основных данных этого не делают. Пока не знаю, почему. - person zumzum; 10.07.2014
comment
@DanielD, но что нужно импортировать в заголовок теста? Потому что #import Query.h не будет найден тестовой целью. Нужно ли также обновлять путь «Включить заголовки», чтобы ссылаться на встроенные заголовки целевого приложения? Что-то вроде этого? $(CONFIGURATION_TEMP_DIR)/‹AppTargetName›.build/DerivedSources - person Daniel Thorpe; 13.07.2014

Мне потребовалось время, чтобы понять это. Идеальное решение — импортировать заголовок моста в саму тестовую цель. Перейдите в Build Settings > Swift compiler > Code Generation и укажите имя вашего заголовка моста. Будьте осторожны, тестовая цель не выбрана по умолчанию. Вы должны выбрать его на полосе прокрутки (она расположена в той же строке, что и «Общие», «Информация», «Настройки сборки», «Фазы сборки» и «Правила сборки»). Таким образом, у вас будет один и тот же связующий заголовок как для вашего проекта, так и для разных целей тестирования.

person Swift Rabbit    schedule 26.07.2014
comment
Но, как и в zumzum, у меня нет связующего заголовка, и моя цель приложения работает, а моя тестовая цель — нет. - person Zac Tolley; 24.09.2014