module.map для доступа к классам (Swift и Objective-C) в основной цели из тестовой цели

Я нахожусь в процессе добавления классов Swift в существующий проект Objective-C. В рамках этого я добавил MyProjectTests.swift к цели MyProjectTests. Он импортирует классы Swift из целевого MyProject с import MyProject, и это прекрасно работает.

Теперь я хочу использовать @import Swift; и в MyProjectTests.m. Однако компилятор выдает ошибку Module 'MyProject' not found.

У меня есть эти вопросы:

Сделать так, чтобы импорт и @import успешно выполнялись в тестовой цели

Почему компилятор Swift видит модуль MyProject, а компилятор Objective-C — нет? Какие настройки сборки в MyProjectTest мне нужно изменить, чтобы @import MyProject тоже удалось.

Экспортировать классы Objective-C из основной цели

В конечном итоге MyProjectTest.swift и MyProjectTest.m также потребуется доступ к классам Objective-C от цели MyProject. До сих пор у меня были многоцелевые такие файлы, но я хочу переключиться на использование модулей и здесь.

Насколько я понимаю, это вопрос предоставления файла module.map, в котором будут перечислены заголовочные файлы. для классов, которые я хочу "экспортировать".

Какие именно шаги я должен пройти? Где я должен поместить заголовочный файл и какие параметры сборки мне нужно изменить в двух целях MyProject и MyProjectTests?

В настоящее время у меня есть (пока пустой) module.map внутри моего проекта, и настройки сборки для цели MyProject включают Defines Module: Yes, Product Module Name: MyProject.

ОБНОВЛЕНИЕ Сейчас я задаюсь вопросом, возможно ли невозможно открыть файлы (Objective-C) из приложения iOS (вместо framework) как модуль. Но тогда это уже работает для файлов Swift (каким-то образом).


person Drux    schedule 28.01.2015    source источник


Ответы (1)


К настоящему времени я пришел к выводу, что это невозможно с текущими инструментами Xcode (6.1.1). (Что за трата времени!)

Старая схема битаргетинга исходных файлов как на MyProject, так и на MyProjetTest также представляет несколько проблем для смешанного проекта Objective-C/Swift с нетривиальным объемом кода:

  • Его часть Objective-C определяет устаревший NS_ENUM(Integer, Repeat), имя которого конфликтует с Swift.Repeat<T>. Обращение к нему как MyProject.Repeat (не MyProjectTests.Repeat) вызывает проблемы при компиляции для цели MyProjectTests, которые изменение этой цели Project Name (также) на MyProject (не: MyProjectTests), похоже, не решает.

  • Компиляция конструкций, в которых класс Swift A использует класс Objective-C B, который, в свою очередь, использует класс Swift C, кажется невозможным простым способом. Поскольку компилятор еще не создал MyProject-Swift.h с определением C, он не может скомпилировать B. Но поскольку он не может скомпилировать B, он не может скомпилировать A и, следовательно, не может создать MyProject-Swift.h. Поймай 22, или так кажется.

  • Двунаправленный код Swift импортирует классы Swift из автоматически сгенерированных MyProject-Swift.h. Для цели MyProjectTests это имя неприменимо, но оно есть в исходных файлах. Я не хотел идти по пути изменения MyProjectTests' Project Name (см. выше). Импорт правильного автоматически сгенерированного файла через цели *.pch может быть возможен, но тогда это может быть не...

person Drux    schedule 29.01.2015