Классы Swift, помеченные @objc, не добавляются в заголовок "-Swift.h" в смешанной среде Objective-C / Swift - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь преобразовать старую статически связанную библиотеку в платформу. Со смешанным быстрым и целевым c в статической библиотеке все заголовки генерируются правильно. Однако, переключаясь на целевую среду фреймворка и добавляя файлы swift, помеченные заголовком @objc, класс не добавляется в заголовок -Swift.h. Я могу импортировать заголовок, но быстрые классы не найдены. Это в Xcode 10.2 и попытались использовать оба Swift 4.2 и 5.

Существуют ли какие-либо конкретные настройки в XCode, которые повлияют на генерацию заголовка * -Swift.h в смешанной целевой структуре Objective C / Swift?

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

У меня была похожая проблема.В моем случае это была известная проблема в Xcode 10.2:

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_release_notes

Если вы создаете фреймворк, содержащий код Swift, и используете lipo для создания бинарного файла, который поддерживает обаПлатформы устройств и симуляторов. Вы также должны объединить сгенерированные заголовки Framework-Swift.h для каждой платформы, чтобы создать заголовок, который поддерживает платформы как устройств, так и симуляторов.(48635615) ...

В моем случае все, что мне нужно было сделать, это обновить Carthage до последней версии 0.33.0

1 голос
/ 28 марта 2019

Проблема, по-видимому, связана с новой системой сборки Apple, ожиданиями, которые они устанавливают при компиляции, и количеством взаимозависимостей в настройке проекта.

Новая система сборки запускает компиляции Swift параллельно,При наличии нескольких зависимостей библиотеки / фреймворка, которые смешивают Objective C и Swift, компилятор, по-видимому, не генерирует файлы -Swift.h вовремя.В статических библиотеках файлы -Swift.h, по-видимому, создаются в конце процесса быстрой компиляции, то есть они генерируются недостаточно быстро для использования файлами Objective C при компиляции Objective C.При создании инфраструктуры создается впечатление, что компилятор генерирует заголовок в начале процесса компиляции, а файлы Swift компилируются не полностью, а файл -Swift.h не генерируется соответствующим образом с интерфейсами и протоколами класса Objective C.

То, что это означает, в конечном итоге означает, что мы не можем полагаться на «целевые зависимости» для правильного построения зависимых проектов.

Итак, как мы можем построить нашу .framework из смешанной Цели C и-Swift.h без тонны ручных сценариев.

Вот обнаруженные мной приемы, которые будут работать.

  1. Используйте старую систему сборки.При использовании новой системы сборки возникает ошибка при попытке объединить карту модулей для файла статической библиотеки, говорящую о том, что он не может найти файл * -Swift.h, независимо от того, существует он или нет.
  2. Создайте свой файл.Framework, создавая оболочку статической библиотеки:
    • Предоставляя им одинаковое имя продукта и имя модуля.
    • Добавьте один файл .Swift в сборку Framework, чтобы он имел что-токомпилировать и связывать библиотеки swift.
    • ссылка на статическую библиотеку в фреймворке.
    • Добавить все необходимые заголовки в публичные заголовки фреймворка.
    • Добавить всепубличные заголовки к зонтичному заголовку.
    • Используйте фазу сценария запуска, чтобы скопировать файл * -Swift.h из статической сборки библиотеки в посткомпиляцию продукта платформы.
    • Для любых открытых заголовков, которыевключите * -Swift.h, вам может потребоваться опубликовать заголовок и заменить импорт * -Swift.h соответствующим импортом инфраструктуры, т.е.Это не рекомендуется из-за возможного циклического импорта в заголовок зонтика.
  3. При выполнении очистки сначала создайте целевую структуру фреймворка перед созданием целевой прикладной программы.

Ниже приведен пример сценария для копирования файла пост-сборки * -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 в«Весь модуль», похоже, положительно влияет на эту проблему, но я не полностью его протестировал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...