Подтвердить что ты не робот

Объективные классы C в динамической структуре iOS Swift

Ситуация:

У меня есть jyan dyanmic framework, написанная в Swift. У меня также есть куча классов, написанных в Objective C, которые я хотел бы использовать в своих классах Swift (некоторые из них являются общедоступными, некоторые из них являются частными). Однако, мне бы хотелось, чтобы классы Objective C не подвергались проектам с использованием моей инфраструктуры.


То, что я пробовал:

Заголовок зонтика

Из того, что я понимаю, я должен импортировать с помощью #import header.h в мой заголовочный файл зонтика, который обычно FrameworkName.h, а затем убедитесь, что все файлы заголовков Objective C, которые я хочу включить в мои классы Swift, отмечены как "Public", в разделе "Фазы сборки" → "Заголовки".

Выполнение этого, однако, автоматически предоставляет проект, используя мою инфраструктуру, для всех частных классов Objective C, которые использует инфраструктура.

Сопоставление модулей (с отдельным модулем)

Из-за этого я изучил использование модульного сопоставления, которое описано здесь. Я просмотрел сообщения других пользователей, таких как this и this, а также как это репозиторий Github.

Я успешно получил следующую работу:

//SharedClasses/module.modulemap
module SharedClasses {
}

//SharedClasses/module.private.modulemap
module SharedClasses.Private {
    header "header.h"
    export *
}

Проблема заключается в том, что в моем проекте (который импортировал эту инфраструктуру):

import Framework
import Framework.SharedClasses

допускается, а затем раскрываются "скрытые" классы Objective C. Возможно, именно так работают модули? Есть ли способ сделать их действительно частными?

Сопоставление модулей (с собственным частным модулем)

Кроме того, я попытался создать файл module.private.modulemap в корне моей рамки со следующим содержимым:

explicit module Framework.Private {
    header "header.h"
    export *
}

а затем привязав его к настройкам моей целевой сборки в MODULEMAP_PRIVATE_FILE. Однако, когда я делаю import Framework.Private в моих классах Swift, возникает ошибка компилятора:

"Нет такого модуля 'Framework.Private'

Я не понимаю, почему эта ошибка возникает.

Сопоставление модулей (с закрытым заголовком)

Я заметил, что в Clang docs указан спецификатор private:

Заголовок с частным спецификатором может не включаться извне самого модуля.

Я понимаю, что, поскольку все классы Swift в моей структуре уже являются частью модуля Framework, если я создаю файл module.modulemap со следующим:

framework module Framework {
    umbrella header "Framework.h"

    private header "header.h"

    export *
    module * { export * }
}

тогда все должно работать! Заголовки Objective C доступны только в модуле (т.е. В классах Swift) и не подвергаются какому-либо проекту с использованием фреймворка. Прохладный, но он не работает... компилятор просто не распознает классы Objective C. Никаких других ошибок не возникает, но вы не можете использовать заголовки, так что, как будто вы не включали заголовки в первую очередь. ЗАЧЕМ? И для чего тогда является частным спецификатором?


Су, повторив мой первоначальный вопрос:

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

Спасибо за чтение и извините за длинный пост. Это был долгий день (и ночь)...

4b9b3361

Ответ 1

Вы можете найти метод эту ссылку.

Просто создайте папку (например, PrivateA) с модулем .modulemap, где будут включены все заголовки объектов, которые необходимо использовать в вашем классе Swift. например.

module $(ModuleName)Private {
    header "header.h"
    export *
}

в Swift, вы можете использовать: import $(ModuleName)Private

поэтому модуль по умолчанию исключает эти заголовки при использовании import $(ModuleName).

Из моего эксперимента тестовый проект также может import $(ModuleName)Private, но не нашел полезного кода.

Попробуйте этот путь в любом случае.