Это ожидаемое поведение компилятора и по очень веской причине.
Я думаю , что большинство людей , работающих в этом проблемы вызываются после того, как они переходят от Application Target
к Framework Target
и начать добавлять C и Objective C заголовки в фреймворка заголовок зонтика ожидая его , чтобы иметь такое же поведение , как Bridging заголовок приложения , который ведет себя по- разному. Заголовок зонтика фактически предназначен для смешанной быстрой среды obj-c, и его цель - представить API-интерфейсы внешнему миру, который есть у вашей платформы в target-c или c. Это означает, что заголовки, которые мы помещаем туда, должны быть в открытом доступе.
Он не должен использоваться как место, которое предоставляет заголовки Objective-C / C, которые не являются частью вашей платформы, быстрому коду вашей платформы. Потому что в этом случае эти заголовки также будут представлены внешнему миру как часть нашего каркасного модуля, что часто не то, что мы хотим сделать, поскольку это нарушает модульность. (И именно поэтому параметр « Разрешает немодульные включения в модуле фреймворка» по умолчанию равен NO )
Чтобы представить библиотеку Objective-C / C в вашем быстром коде фреймворка, мы должны определить отдельный модуль swift для такой библиотеки. Тогда import YourLegacyLibrary
можно использовать стандартный Swift .
Позвольте мне продемонстрировать это на некотором типичном сценарии: встраивание libxml2
в нашу структуру.
1. Сначала нужно создать module.modulemap
файл, который будет выглядеть следующим образом:
Для платформы OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Для платформы iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Все, что он делает, - это оборачивает заголовок и любые другие заголовки, на которые он ссылается, внутри модуля swift, так что swift сможет генерировать привязки swift для этих интерфейсов Си.
2. Затем в каталоге вашего проекта xcode создайте папку SwiftLibXML2
и поместите туда этот модуль.modulemap
3. В настройках сборки добавьте $(SDKROOT)/usr/include/libxml2
в пути поиска заголовка
4. В настройках сборки добавьте $(SRCROOT)/SwiftLibXML2
в пути импорта
5. В рамках проекта в Общие Вкладка, добавьте libxml2.tbd
в Linked рамочные и библиотек .
Теперь вы импортируете этот модуль, где это необходимо, с помощью:
import SwiftLibXML2
(если вы хотите посмотреть более полный пример module.map, я бы посоветовал сослаться на модуль module.modulemap Дарвина, для его установки /usr/include/module.modulemap
вам понадобятся инструменты командной строки Xcode, ссылка отсутствует / usr / include в OS X El Capitan )