Проблема, по-видимому, связана с новой системой сборки Apple, ожиданиями, которые они устанавливают при компиляции, и количеством взаимозависимостей в настройке проекта.
Новая система сборки запускает компиляции Swift параллельно,При наличии нескольких зависимостей библиотеки / фреймворка, которые смешивают Objective C и Swift, компилятор, по-видимому, не генерирует файлы -Swift.h вовремя.В статических библиотеках файлы -Swift.h, по-видимому, создаются в конце процесса быстрой компиляции, то есть они генерируются недостаточно быстро для использования файлами Objective C при компиляции Objective C.При создании инфраструктуры создается впечатление, что компилятор генерирует заголовок в начале процесса компиляции, а файлы Swift компилируются не полностью, а файл -Swift.h не генерируется соответствующим образом с интерфейсами и протоколами класса Objective C.
То, что это означает, в конечном итоге означает, что мы не можем полагаться на «целевые зависимости» для правильного построения зависимых проектов.
Итак, как мы можем построить нашу .framework из смешанной Цели C и-Swift.h без тонны ручных сценариев.
Вот обнаруженные мной приемы, которые будут работать.
- Используйте старую систему сборки.При использовании новой системы сборки возникает ошибка при попытке объединить карту модулей для файла статической библиотеки, говорящую о том, что он не может найти файл * -Swift.h, независимо от того, существует он или нет.
- Создайте свой файл.Framework, создавая оболочку статической библиотеки:
- Предоставляя им одинаковое имя продукта и имя модуля.
- Добавьте один файл .Swift в сборку Framework, чтобы он имел что-токомпилировать и связывать библиотеки swift.
- ссылка на статическую библиотеку в фреймворке.
- Добавить все необходимые заголовки в публичные заголовки фреймворка.
- Добавить всепубличные заголовки к зонтичному заголовку.
- Используйте фазу сценария запуска, чтобы скопировать файл * -Swift.h из статической сборки библиотеки в посткомпиляцию продукта платформы.
- Для любых открытых заголовков, которыевключите * -Swift.h, вам может потребоваться опубликовать заголовок и заменить импорт * -Swift.h соответствующим импортом инфраструктуры, т.е.Это не рекомендуется из-за возможного циклического импорта в заголовок зонтика.
- При выполнении очистки сначала создайте целевую структуру фреймворка перед созданием целевой прикладной программы.
Ниже приведен пример сценария для копирования файла пост-сборки * -Swift.h.
header_file="${TARGET_TEMP_DIR}/../${PRODUCT_MODULE_NAME}.build/DerivedSources/${PRODUCT_MODULE_NAME}-Swift.h"
header_dir="${BUILT_PRODUCTS_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}"
mkdir -p "$DIR"
echo "copying $header_file $header_dir"
cp -f "$FILE" "$DIR"
ОБНОВЛЕНО
Пометка всех модулей в режиме компиляции Swift в«Весь модуль», похоже, положительно влияет на эту проблему, но я не полностью его протестировал.