Как импортировать частные заголовки фреймов в среду Swift?
У меня есть фреймворк Objective-C (фреймворк A), который предоставляет некоторые публичные и некоторые частные заголовки. Публичные заголовки также объявляются в заголовке зонтика. У меня есть вторая среда Swift (структура B), которая связана с каркасом Objective-C.
Теперь, если я хочу импортировать публичные заголовки A в B, мне просто нужно сделать import A
.
Но как мне импортировать частные заголовки?
Я знаю, что заголовок моста не является вариантом, поскольку это не поддерживается для фреймворков. Нужно ли мне каким-то образом создать отдельный заголовок зонтика для личных заголовков?
Ответы
Ответ 1
Вам нужно изменить framework A
, чтобы он экспортировал частный модуль.
-
Создайте файл файл приватного модуля в проекте A
. Это будет примерно так:
А /private.modulemap:
explicit module A.Private {
// Here is the list of your private headers.
header "Private1.h"
header "Private2.h"
export *
}
-
В "Настройках сборки" целевой среды A
найдите строку "Файл приватного модуля модуля" и сделайте это:
$(SRCROOT)/A/private.modulemap
-
Не включайте файл private.modulemap
в "Скомпилировать источники". Это вызывает ненужные предупреждения.
-
Очистить и создать фреймворк A
.
-
В рамках B файлов Swift. вы можете импортировать частный модуль следующим образом:
import A
import A.Private
Ответ 2
Моя ситуация может зависеть от моих настроек, но я предложу это здесь, на случай, если это поможет кому-то еще. У меня также есть среда Objective-C (структура A) с частными заголовками, которые мне нужно использовать в среде Swift (структура B). Некоторые дополнительные детали:
-
Каждый фреймворк находится в отдельном проекте в рабочей области
-
В проекте используются CocoaPods
-
Подспецификация определяет следующие отношения зависимости между двумя структурами:
s.subspec 'FrameworkA' do |cs|
cs.vendored_frameworks = "lib/FrameworkA.framework"
end
s.subspec 'FrameworkB' do |ts|
ts.dependency 'FrameworkA'
ts.vendored_frameworks = "lib/FrameworkB.framework"
end
Решение, предлагаемое @rintaro, прекрасно работает для меня при работе в Xcode, но после развертывания Pod FrameworkB
не может найти частные заголовки, используя пути в частной карте модулей, которая находится в FrameworkA
. Что мне PrivateHeaders
это использование относительного пути к PrivateHeaders
в приватной карте модулей:
module FrameworkA_Private {
header "../FrameworkA_Private.framework/PrivateHeaders/Private.h"
export *
}
Это работает в Xcode и в конечном продукте, установленном с использованием CocoaPods. Это немного странно, поскольку оно ссылается на папку в конечном продукте сборки, и я не удивлюсь, если найдется какой-то другой способ сообщить CocoaPods, как сохранить эти пути, но как бы там ни было, я не нашел его. Это решает проблему на данный момент.