Как изменить SWIFT_MODULE_NAME?

Название говорит само за себя. Я искал в настройках сборки SWIFT_MODULE_NAME и ничего не нашел. Я также искал в Интернете, и есть ссылки на это имя, но нет информации о том, как оно определяется. Кроме того, мне не удалось найти упоминания о SWIFT_MODULE_NAME в Apple Docs.

Я знаю это: он используется в настройке сборки «Objective-C Generated Interface Header Name», и его можно просмотреть, дважды щелкнув значение настройки:

$(SWIFT_MODULE_NAME)-Swift.h

Он используется для преодоления разрыва между Objective-C и Swift и появляется только для проектов, которые включают файлы Swift (наряду с файлами Objective-C, которые я полагаю). На момент публикации Xcode 7.3 является последним и лучшим.

Но где определяется это значение и как его изменить?


person Sheamus    schedule 14.04.2016    source источник
comment
Вы ознакомились с этим документом: developer.apple.com/library/ios/documentation/Swift/Conceptual/ ? обычно это название вашего продукта. Вы можете изменить значение идентификатора пакета продукта в настройках сборки. Обратите внимание, что вы не можете переопределить имя продукта в Framework.   -  person Zhao    schedule 14.04.2016
comment
Да, это полезно, спасибо. Из этого документа: Xcode использует имя вашего модуля продукта (PRODUCT_MODULE_NAME), а не ваше целевое имя (TARGET_NAME) — при именовании связующего заголовка Objective-C и сгенерированного заголовка для вашего кода Swift.   -  person Sheamus    schedule 14.04.2016


Ответы (4)


Имя модуля берется из настройки сборки Product Module Name:

скриншот настроек сборки

Настройка SWIFT_MODULE_NAME явно скрыта, но вы можете увидеть ее происхождение, взглянув на Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/XCLanguageSupport.xcplugin/Contents/Resources/Swift.xcspec:

...
{
    Name = "SWIFT_MODULE_NAME";
    Type = String;
    DefaultValue = "$(PRODUCT_MODULE_NAME)";
    CommandLineArgs = (
        "-module-name",
        "$(value)",
    );
},
...
person jtbandes    schedule 14.04.2016
comment
Спасибо, вот оно! Я изменил PRODUCT_MODULE_NAME, и SWIFT_MODULE_NAME был обновлен! - person Sheamus; 14.04.2016
comment
О боже, 4 часа искали это - обсуждали концепцию выхода на пенсию. Версия Xcode 9.4 (9F1027a) заполнила его пустым из нового быстрого проекта, созданного 3 дня назад. Я опубликую возможную ошибку. ой! не забудьте #import MsbHrv-Swift.h в .m, для каждой функции объекта swift, к которому вы обращаетесь, поместите @objc перед объявлением в файле .swift и убедитесь, что это SWIFT_MODULE_NAME установлено в PRODUCT_MODULE_NAME . ИЛИ просто постройте все быстро, будьте счастливы и гладьте щенков, чтобы успокоить свой день. - person Matthew Ferguson; 11.06.2018
comment
Обратите внимание, что имя модуля продукта по умолчанию использует $(PRODUCT_NAME:c99extidentifier), поэтому лучше всего изменить это, чтобы убедиться, что вы установили значение PRODUCT_NAME или Product Name, и все будет обновлено соответствующим образом. - person Dino Alves; 26.09.2018
comment
Чтобы продолжить наблюдение Дино: есть еще один шаг, потому что PRODUCT_NAME определен как $(TARGET_NAME). Но... там тупик. Я не могу найти TARGET_NAME ни в одной из настроек; возможно, Xcode показывает его только в навигаторе проекта (левая панель). Еще одна вещь: если название вашего проекта или продукта написано через дефис, Xcode заменит дефис символом подчеркивания. Это приведет к сбою сборки, если вы явно ссылаетесь на ожидаемое имя файла $(SWIFT_MODULE_NAME)-Swift.h в любом месте. - person Oscar; 07.05.2019

Перейдите в настройки сборки и нажмите + рядом с «Уровни». Видеть :

введите описание изображения здесь

замените NEW_SETTING на SWIFT_MODULE_NAME для имени настройки, и любое имя модуля для файла .h (без пробелов, пожалуйста) идет справа.

person Anton Tropashko    schedule 23.10.2017
comment
Нажмите знак «плюс» для добавления пользовательских настроек — это то, что я сначала пропустил. - person James Wyman; 23.10.2017
comment
Добавлен SWIFT_MODULE_NAME и исправлены мои модульные тесты на XCode 9, потому что в имени нашего модуля есть -. Спасибо. - person SXC; 16.02.2018

SWIFT_MODULE_NAME, PRODUCT_MODULE_NAME, PRODUCT_NAME, EXECUTABLE_NAME

Значения по умолчанию:

EXECUTABLE_NAME = $EXECUTABLE_PREFIX$PRODUCT_NAME$EXECUTABLE_SUFFIX
SWIFT_OBJC_INTERFACE_HEADER_NAME = $(SWIFT_MODULE_NAME) 

SWIFT_MODULE_NAME = $(PRODUCT_MODULE_NAME)
PRODUCT_MODULE_NAME = $(PRODUCT_NAME:c99extidentifier)
PRODUCT_NAME = $(TARGET_NAME:c99extidentifier)

Наблюдение:

SWIFT_MODULE_NAME == PRODUCT_MODULE_NAME

c99extidentifier

Xcode может заменить значение переменной c99extidentifier идентификатора, которая поддерживает расширенные символы из C99.

//for example
PRODUCT_NAME = My Framework
PRODUCT_MODULE_NAME = $(PRODUCT_NAME:c99extidentifier) = My_Framework

EXECUTABLE_NAME имя бинарника

Product Module Name(PRODUCT_MODULE_NAME) определяет, как будет выглядеть оператор import. Например, когда вы создаете Library или Framework.

С использованием:

//Objective-C
@import module_name; 

//Swift
import module_name 

Product Name(PRODUCT_NAME) определяет имя бинарника. Например. MyFramework.framework

[TARGET_NAME]

Правило:

SWIFT_MODULE_NAME should equal to PRODUCT_MODULE_NAME

[Пользовательский .modulemap ]

person yoAlex5    schedule 15.08.2019

Вы ознакомились с этим документом: developer.apple.com/library/ios/documentation/Swift/Conceptual/…? обычно это название вашего продукта. Вы можете установить изменение значения в «Идентификаторе набора продуктов» в настройках сборки. Обратите внимание, что вы не можете переопределить имя продукта в Framework.

Смотрите скриншот:

введите здесь описание изображения

person Zhao    schedule 14.04.2016