TARGET_OS_IPHONE и ApplicationTests

Почему этот код не работает при компиляции пакета ApplicationTests unit test?

#if TARGET_OS_IPHONE
   #import <Foundation/Foundation.h>
   #import <UIKit/UIKit.h>
#else
   #import <Cocoa/Cocoa.h>
#endif

Одна из моих зависимостей имеет эту проверку и компилируется в моих основных пакетах приложений, но она пытается загрузить <Cocoa/Cocoa.h> при компиляции пакета ApplicationTests. Вероятно, это просто отсутствие понимания XCode, но я нервничаю, когда мои тестовые пакеты не строятся. Любые предложения?

Ответ 1

У меня была аналогичная проблема: TARGET_OS_IPHONE не задается при создании статической библиотеки. Моим решением было добавить "-DTARGET_OS_IPHONE" в раздел "Other C Flags" целевых вариантов сборки.

Ответ 3

Самое простое решение - переместить оператор #import <Foundation/Foundation.h>, если условие #if и заменить Cocoa на AppKit следующим образом:

#import <Foundation/Foundation.h>
#if TARGET_OS_IPHONE
   #import <UIKit/UIKit.h>
#else
   #import <AppKit/AppKit.h>
#endif

Заголовок заголовка Foundation импортирует заголовок NSObjCRuntime, который, в свою очередь, импортирует заголовок TargetConditionals.

Ответ 4

Он не налагает штраф за производительность, хотя это может повредить время компиляции. Тем не менее, это не проблема для Objective C. Однако это может действительно повредить при работе с классами С++.