Swift: как использовать флаги препроцессора (например, "#if DEBUG") для реализации ключей API?


на Objective-C иногда было полезно использовать статические строковые константы для определения альтернативных ключей API (например, чтобы различать ключи выпуска и отладки для пакетов аналитики, таких как MixPanel, Flurry или Crashlytics):

#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif

и потом...

[Analytics startSession:API_KEY];

как это перевести на Swift, так как компилятор Swift больше не использует препроцессор?

2 52

2 ответа:

Apple включила полную поддержку флагов препроцессора Swift начиная с Xcode 8, поэтому больше не нужно устанавливать эти значения в "других флагах Swift".

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

С Xcode 8 примечания к выпуску:

Active Compilation Conditions - это новый параметр сборки для передачи флагов условной компиляции компилятору Swift. Каждый элемент значения этого параметра переходит в swiftc с префиксом -D, таким же образом, что элементы Preprocessor Macros перейти к clang с тем же префиксом. (22457329)

enter image description here

вы используете вышеуказанную настройку, например Итак:

#if DEBUG
    let accessToken = "DebugAccessToken"
#else
    let accessToken = "ProductionAccessToken"
#endif

обновлено: Xcode 8 теперь поддерживает это автоматически, см. ответ @DanLoewenherz выше.

до Xcode 8, Вы все еще можете использовать макросы таким же образом:

#if DEBUG
let apiKey = "KEY_A"
#else
let apiKey = "KEY_B"
#endif

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

  • Откройте настройки сборки для вашей цели
  • Поиск "другие флаги swift"
  • добавить макросы, которые вы хотите использование, предшествующее -D флаг

enter image description here