2015-12-17 1 views
3

Я конвертирую приложение Objective-C в Swift и используя существующие тестеры Objective-C для подтверждения того, что изменения работают исправно.Быстрые классы внутри Objective-C unit test - Неполное сгенерированное «-Swift.h»

я заменил пару Objective-C файлов приложений с Swift и сделал следующее:

  • добавил «@objc класс», где это необходимо (в дополнение к наследованию из класса Objective-C),
  • нацелил файлы Swift на цели MyApp и MyAppTest,
  • установить «Включить тестируемость да» (только для отладки) для обеих целей.
  • В тестовых файлах модулей я добавил #import «MyAppTests-Swift.h» и удалил #import «MyObjcClass.h».
  • Я также удалил «MyObjcClass.m» из списка источников компиляции фазы сборки.

Xcode создает файл «MyAppTests-Swift.h». Изучив сгенерированный файл (cmd-click), вы увидите обычную массу Swift, определенную #if #defines, которая предшествует тому, где мои классы Swift должны быть расположены, но нет.

Приложение будет создавать и работать нормально с заменой файлов Swift. В приложении есть другие файлы Objective-C, которые импортируют «MyApp-Swift.h, чтобы использовать мои классы Swift». Файл MyApp-Swift.h содержит обычную массу Swift определенных #if #defines и моих классов Swift из файлов приложений Swift.

Xcode генерирует файлы «-Swift.h» для обеих целей. По какой-то причине, тем не менее, тот, который предназначен для целевого теста, не получает информацию о классе Swift, в то время как та, которая предназначена для целевого приложения. Поэтому не проблема использования функции, характерной для Swift, но не Objective-C.

У меня есть устранили все ошибки компиляции, построенный из чистой, но до сих пор не работает.

Любые предложения?

Я использую XC7 (7C68) IOS 9.1

ответ

2

Наконец-то это работает.

Я заметил, что путь заголовка объекта Objective-C для целевой единицы тестирования не был установлен во время установки целевой цели приложения. (Swift Compiler - настройка сборки кода) XC установит этот путь для целевой задачи приложения (возможно, когда он спросит, хотите ли вы создать файл заголовка моста), он, однако, не устанавливает путь для целевой тестовой единицы. Я предполагаю, что он предполагает, что модульное тестирование не потребует доступа к заголовку моста.

Меня не интересовало это раньше, потому что Objective-C Bridging Header используется для импорта кода Obj-C в файлы Swift. В моем Swift-коде не использовались классы Obj-C, поэтому в заголовочном файле моста нет ничего, поэтому я решил, что он не понадобится для целевой тестовой единицы и оставит настройку пути для целевой тестовой единицы по умолчанию.

Оказывается, я был неправ.

На жаворонке я устанавливаю этот путь, чтобы указать на заголовок моста в каталоге приложения (хотя файл не импортирует никаких классов obj-c). Я повторно запускал модульные тесты, и теперь автоматически созданный файл «MyAppTests-Swift.h» содержит классы Swift, на которые ссылаются модульные тесты obj-c.

Кажется немного причудливым.Xcode требуется путь к неиспользуемому файлу (заголовок заголовка), чтобы заставить его добавлять ссылочные классы swift в автоматически сгенерированный файл «-Swift.h».