Как импортировать частные заголовки фреймов в среду 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). Некоторые дополнительные детали:

  1. Каждый фреймворк находится в отдельном проекте в рабочей области

  2. В проекте используются CocoaPods

  3. Подспецификация определяет следующие отношения зависимости между двумя структурами:

    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, как сохранить эти пути, но как бы там ни было, я не нашел его. Это решает проблему на данный момент.