Я занимаюсь разработкой библиотеки 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
?