Подтвердить что ты не робот

Объектный файл заголовка C в Swift с несколькими целями

Я успешно вызываю свои классы Swift из Objective C (для целевого 'MyApp') через оператор import:

#import "MyApp-Swift.h"

Теперь я создал новую цель под названием "MyAppLite"

Когда я компилирую новую цель, я получаю ошибки, потому что код "MyApp-Swift.h" требуется кодом, но компилятор создает "MyAppLite-Swift.h"

Итак, мне нужно создать условный заголовок Swift/ObjC #import для цели, с которой я компилирую.

Как это можно сделать, или есть лучший способ?

4b9b3361

Ответ 1

Также можно установить параметр Product Module Name в Build Settings одинаковым для всех модулей (я установил его в $(PROJECT_NAME)), так что создаваемый файл <project>-Swift.h имеет одно и то же имя в все модули. Это устраняет необходимость добавления/проверки макросов препроцессора.

Ответ 2

Лучший способ найти эту проблему - в настройках общего проекта Xcode. Вы можете найти следующую настройку:

Objective-C Имя заголовка сгенерированного интерфейса *

Если вы установите это значение на общее имя заголовка, например "MyProject-Swift.h", оно будет применено к каждой вашей цели, и вы можете безопасно использовать объявление импорта в любом из ваших файлов Objective-C. Это позволяет вам продолжать использовать уникальные имена модулей продукта для каждой цели, если это необходимо.

Я тестировал это в Xcode Version 6.4 (6E35b).

* Примечание. Это будет отображаться в соответствии с вашими настройками компилятора Swift, которые видны только в том случае, если к вашему проекту добавлены исходные файлы Swift. Кроме того, если у цели нет источника Swift, связанного с ней, параметры компилятора Swift не будут отображаться для этих целевых настроек сборки.

Удачи!

Ответ 3

Предыдущие ответы имеют некоторые проблемы, если вы решите переименовать свои цели или проект или используйте SWIFT_MODULE_NAME, как предполагалось.

Наиболее универсальным решением является изменение SWIFT_OBJC_INTERFACE_HEADER_NAME ( "Objective-C Имя заголовка сгенерированного интерфейса" ) в разделе "Проект", а не "Цели", "Параметры сборки", чтобы:

  • $(PROJECT_NAME)-Swift.h - по одному на проект;
  • $(SWIFT_MODULE_NAME)-Swift.h - по одному на модуль (значение по умолчанию).

введите описание изображения здесь

Ответ 4

Ну, единственный способ, который я могу исправить, - это...

#ifdef IS_LITE
#import "MyApp_Lite-Swift.h"
#else
#import "MyApp-Swift.h"
#endif

Обратите внимание, что если в моем имени модуля продукта есть какие-либо "незаконные" символы, их необходимо заменить символами подчеркивания.

Надеюсь, что это поможет!

Ответ 5

Я поместил соответствующий оператор #import <project> -Swift.h в файл заголовка префикса (<project> -Prefix.pch), определенный/добавленный для каждой сборки (цель/схема).

Ответ 6

Единственный рабочий способ - это:

1 - из первой цели (которая имеет рабочий мост) Настройка сборки выберите Объект C Мостовой заголовок
2- Копирование Объект C Мостовой заголовок
3- открыть другую цель Настройка сборки
4- Вставить его 5- измените заголовочный файл на новый заголовочный файл (например, цель B.h)

(теперь у вас есть этот параметр для двух целей)