2015-04-07 7 views
2

Мое приложение использует lib, который не будет создавать и/или запускаться на симуляторе, поэтому я фактически удалил ссылки на эту библиотеку с помощью окружения с помощью директив препроцессора :Подсветка синтаксиса XCode в обоих условиях препроцессора #if #else

#if !(TARGET_IPHONE_SIMULATOR) 
    //Do the real implementation 
#else 
    //Do a dummy implementation for testing 

XCode автоматически проверяет, что моя текущая цель и оценивает # если/# остального, что я предполагаю, что это отчасти хорошо. Проблема в том, что он отключает подсветку синтаксиса, автозаполнение и т. Д., В зависимости от того, какое условие не собирается компилироваться. (Например, если моя текущая цель является симулятором, код внутри реальной реализации теряет свою подсветку)

Мое плохое решение меняет цель, так что любая реализация, которую я хочу редактировать, получает «активирована». Есть ли способ, чтобы оба они были выделены в любое время, поэтому я могу легко редактировать оба?

ответ

3

Если обе реализации будут составлять для любой цели, то вы могли бы сделать что-то вроде этого:

#if !(TARGET_IPHONE_SIMULATOR) 
    const bool simulator = false; 
#else 
    const bool simulator = true; 
#endif 

    if (simulator) 
    { 
     //Do a dummy implementation for testing 
    } 
    else 
    { 
     //Do the real implementation 
    } 

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

Если код с использованием библиотеки даже не может быть построен, когда цель имитатор, вы можете сделать что-то вроде этого:

#if !TARGET_IPHONE_SIMULATOR 
    if (true) 
    { 
     //Do the real implementation 
    } 
    else 
#endif 
    { 
     //Do a dummy implementation for testing 
    } 

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

Вы также можете реализовать фиктивную версию библиотеки для симулятора. Вы бы определили все интерфейсы, но все просто вернет отказ или даже выбросит исключения. Вы бы использовали #if TARGET_IPHONE_SIMULATOR вокруг всего кода, чтобы библиотека полностью опустела для сборки устройства. Затем вы связываетесь с этим и используете первый подход.

+0

Спасибо за ответ! Я отредактировал свой пост, чтобы уточнить, что библиотека не будет строить на симуляторе, поэтому я не могу сделать первое решение, но отличный ответ; помогает – JordanC