В отсутствие макросов препроцессора существует ли способ определить конкретные конкретные флаги схемы на уровне проекта в проекте Xcode

Перед быстрым я бы определил набор схем для альфа-версий, бета-версий и дистрибутивов. Каждая из этих схем имела бы набор макросов, которые были определены для предотвращения определенных типов поведения на уровне проекта. Самый простой пример - макрос DEBUG = 1, который по умолчанию задан для всех проектов Xcode в схеме по умолчанию для сборки Run. Можно было бы запросить #ifdef DEBUG... и принять решения в коде соответственно, даже составив ненужный код.

Похоже, что этот тип конфигурационного стробирования не так просто использовать быстро, так как макросы не поддерживаются. Может ли кто-то предложить сопоставимый подход, мне все равно, если код будет составлен сам по себе. Однако я хотел бы использовать функции на основе схемы построения.

Ответ 1

В Swift вы все равно можете использовать макросы препроцессора "# if/# else/# endif" (хотя и более ограниченные), согласно Apple docs. Вот пример:

#if DEBUG
    let a = 2
#else
    let a = 3
#endif

Теперь вы должны установить символ "DEBUG" в другом месте. Установите его в разделе "Swift Compiler - Custom Flags", "Other Swift Flags". Вы добавляете символ DEBUG с записью -D DEBUG.

(Настройки сборки → Быстрый компилятор - Пользовательские флаги) enter image description here

Как обычно, вы можете установить другое значение в Debug или в Release.

Я тестировал его в реальном коде; он, похоже, не распознается на детской площадке.

Ответ 2

Мы столкнулись с проблемой, не желая устанавливать быстрые флаги компилятора, потому что мы не хотели устанавливать их и поддерживать их в актуальном состоянии для разных целей и т.д. Кроме того, в нашей смешанной кодовой базе мы не хотели чтобы не забывать постоянно устанавливать флаги для каждого языка.

Для наших мы объявили файл в ObjC

PreProcessorMacros.h

extern BOOL const DEBUG_BUILD;

В .m

PreProcessorMacros.m

#ifdef DEBUG
    BOOL const DEBUG_BUILD = YES;
#else
    BOOL const DEBUG_BUILD = NO;
#endif

Затем в Objective-C заголовок заголовка

#import "PreProcessorMacros.h"

Теперь, используйте это в своей кодовой базе Swift

if DEBUG_BUILD {
    println("debug")
} else {
    println("release")
}

Это, безусловно, обходной путь, но он решил нашу проблему, поэтому я разместил ее здесь в надежде, что это поможет. Это не означает, что существующие ответы недействительны.

Ответ 3

Более быстрое решение для метода Logans. Установите -D DEBUG в Other Swift Flags раздела Swift Compiler - Custom Flags в настройках сборки вашей цели.

Затем объявите следующий метод в глобальной области:

#if DEBUG
let isDebugMode = true
#else
let isDebugMode = false
#endif

Теперь используйте его как

if isDebugMode {
    // Do debug stuff
}

Ответ 4

Я работаю в базе кода смешанного языка, где код obj-c использует макрос для отправки отладочных сообщений на консоль (и этот макрос полагается на наш флаг препроцессора отладки). Я хотел иметь возможность вызвать тот же самый макрос в быстром коде...

  • Я создал метод класса на одном из моих классов obj-c, который является оберткой вокруг этого макроса.
  • Я добавил заголовок obj-c в наш файл заголовка моста.
  • Теперь мой быстрый код вызывает этот метод класса как "прокси" для макроса obj-c.

Мягко раздражает, что я не могу просто вызвать макрос прямо в быстром коде, но по крайней мере сейчас у меня есть только одно место в проекте, чтобы беспокоиться о включении/отключении флага отладки.

Ответ 5

Для меня для элемента отладки условия активной компиляции"установлено значение" DEBUG ".

Затем с помощью ключа DEBGU работа в #IF DEBUG работает в режиме отладки и #ELSE в режиме выпуска:

  1. Выберите цель,
  2. На вкладке "Настройка сборки" найдите "Условие активной компиляции",
  3. Установите значение его элемента "Debug" равным "YourKeyWord",
  4. Используйте просто так:

    #if DEBUG
        print("You'r running in DEBUG mode!")
    #else
        print("You'r running in RELEASE mode!")
    #endif