Основываясь на этой статье Apple, https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/using_imported_c_macros_in_swift, простые макросы C (и Objective-C) импортируются в Swift как глобальные константы.Это демонстрируется выводом из вашей строки
print("Macro \(TEST_FLAG)")
Фрагмент
#if TEST_FLAG
print("compiled XXXxXXXXX")
#endif
использует другой TEST_FLAG
, который является флагом препроцессора Swift.Вы можете определить его в Настройках сборки -> Условия активной компиляции как TEST_FLAG
или в Настройках сборки -> Другие флаги Swift как -DTEST_FLAG
.
Выше объясняется, почему это происходит.Я не могу придумать простой способ избежать определения одного и того же флага отдельно для Objective-C и препроцессора Swift в Xcode.Если вы просто хотите контролировать, выполняется ли какой-либо код Swift , выполняемый на основе TEST_FLAG
, вы можете сделать что-то вроде этого:
if TEST_FLAG != 0 {
print("compiled XXXxXXXXX")
}
Однако, если вы хотите контролировать компиляция кода, тогда вам, возможно, придется использовать отдельные TEST_FLAG
s для Objective-C и Swift и убедиться, что они согласованы.Чтобы помочь сделать их согласованными, вы можете установить TEST_FLAG
, используемый кодом Objective-C, в Other C Flags
, что позволит вам определять разные флаги для разных SDK, архитектур и типов сборки (Release / Debug).Условия активной компиляции допускают такую же гибкость.
Еще один прием для обеспечения согласованности между (Objective-) C и флагами компилятора Swift заключается в создании нового пользовательского параметра сборки: нажмите +
слева отОкно поиска в настройках сборки.
Скажите, назовите его COMMON_TEST_FLAG
и установите его значение на TEST_FLAG
.Затем добавьте -D$(COMMON_TEST_FLAG)
к другим флагам C и другим флагам Swift.Теперь, когда вы создадите свой код, TEST_FLAG
будет определен как в Objective-C, так и в коде Swift в вашей цели.Если вы не хотите, чтобы он был определен, просто измените значение COMMON_TEST_FLAG
на другое.Однако следует обратить внимание на пару вещей:
- Вы не можете сделать
COMMON_TEST_FLAG
пустым: это приведет к тому, что другие флаги будут просто -D, что приведет к ошибке сборки. - Убедитесь, что значение
COMMON_TEST_FLAG
не конфликтует с макросами, определенными в других местах.