Объектный файл заголовка C в Swift с несколькими целями
Я успешно вызываю свои классы Swift из Objective C (для целевого 'MyApp') через оператор import:
#import "MyApp-Swift.h"
Теперь я создал новую цель под названием "MyAppLite"
Когда я компилирую новую цель, я получаю ошибки, потому что код "MyApp-Swift.h" требуется кодом, но компилятор создает "MyAppLite-Swift.h"
Итак, мне нужно создать условный заголовок Swift/ObjC #import
для цели, с которой я компилирую.
Как это можно сделать, или есть лучший способ?
Ответы
Ответ 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)
(теперь у вас есть этот параметр для двух целей)