Скрыть цель C в смешанной библиотеке Swift Cocoapod - PullRequest
1 голос
/ 04 апреля 2020

Я занимаюсь разработкой библиотеки Swift Cocoapod, которая на самом деле является оболочкой для некоторого кода Objective C. Моя цель - показать только часть библиотеки Swift, сделав Цель C максимально приватной. Однако, поскольку часть Swift является оберткой вокруг кода Objective C, она должна иметь к ней доступ, хотя и только внутри.

Я искал и пробовал различные подходы, но ни один из них не работал вообще.


Сначала я попытался решить эту проблему с помощью файла modulemap . Идея состояла в том, чтобы создать модуль Swift, называемый чем-то вроде MyLibrary, содержащий весь код Swift, в то время как код Objective C будет находиться в модуле MyLibrary.Private (я знаю, что модуль все еще будет доступен, но это разделение будет достаточно для меня). modulemap будет выглядеть примерно так:

//MyLibrary.modulemap

framework module MyLibrary {
    module Private {
        header "MyObjectiveC.h"
        export *
    }
}

И добавление следующей строки в файл MyLibrary.podspec

s.module_map = 'path/to/MyLibrary.modulemap'

Однако при использовании этого подхода даже если бы я только импортировал модуль MyLibrary, он все равно получил бы доступ ко всем классам Objective C, без необходимости импортировать модуль MyLibrary.Private.


Второй вариант, который я попробовал, был использовать private.modulemap файл. Таким образом, я получу два разных файла modulemap :

//MyLibrary.modulemap

framework module MyLibrary {}
//MyLibrary.private.modulemap

module MyLibrary.Private {
    header "MyObjectiveC.h"
    export *
}

Затем я добавлю следующую строку в файл MyLibrary.podspec

s.pod_target_xcconfig = { 'MODULEMAP_PRIVATE_FILE' => '$(PODS_ROOT)/MyLibrary/path/to/MyLibrary.private.modulemap' }

Однако я получаю сбой сборки, сообщающий, что он не может найти модуль MyLibrary.Private.


Есть ли что-то, что я делаю неправильно в этих подходах? Или есть какой-либо другой способ разрешить классам Swift моей библиотеки доступ к классам Objective C в частном порядке, не подвергая их, по крайней мере, явному, требованию импортировать для него указанный модуль c *.Private?

...