Создание межплатформенного класса iOS/OS X - программирование
Подтвердить что ты не робот

Создание межплатформенного класса iOS/OS X

Я прочитал много вопросов о создании кросс-платформенной библиотеки для этих двух систем. Каждый ответ указывает на статическую библиотеку в качестве решения.

Я не хочу ставить статическую библиотеку, мне бы хотелось создать класс с методами для iOS и их аналогов для OS X.

-(void)createColor:(NSColor*);
-(void)createColor:(UIColor*);

Первая проблема, с которой я столкнулась, заключается в том, что я не могу найти способ использовать классы, доступные только в конкретной системе. Например, как я могу управлять функцией, которая работает с UIColor в iOS и с NSColor в OS X?

Если я создаю проект для iOS, когда я смотрю в Foundation.h, я не могу найти NSColor.h в списке заголовков.

Я думал использовать определения TARGET_OS_MAC и TARGET_OS_IPHONE, чтобы провести различие между двумя системами... Я на правильном пути?

РЕДАКТИРОВАТЬ, чтобы добавить дополнительную информацию:

В настоящий момент у меня есть 2 цели: iOSTestApp и OSxTestApp. Для этих целей я включил необходимые рамки в зависимости от системы.

Использование TARGET_OS_MAC и TARGET_OS_IPHONE работает только при выборе OSXTestApp в качестве активной цели. Когда я выбираю iOSAppTest, Xcode возвращает ошибки для типа данных OS X (т.е. NSColor)

Вот пример кода, который производит эти ошибки:

#if TARGET_OS_MAC
-(void)createColor:(NSColor*)color;    

#elif TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#endif

Пока я инвертирую определения, он работает... Вот пример кода, который производит эти ошибки:

#if TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#elif TARGET_OS_MAC
-(void)createColor:(NSColor*)color;

#endif
4b9b3361

Ответ 1

Проблемы, которые вы видите, возникают из-за того, что TARGET_OS_IPHONE определяется как вариант TARGET_OS_MAC. (Другими словами, TARGET_OS_IPHONE является более конкретным случаем TARGET_OS_MAC. Или TARGET_OS_MAC относится к прямоугольнику, так как TARGET_OS_IPHONE относится к квадрату).

Таким образом, при компиляции для iOS возникают следующие ошибки кода, поскольку iOS будет соответствовать обоим этим условиям, но NSColor не определен для iOS.

#if TARGET_OS_MAC
-(void)createColor:(NSColor*)color;    

#elif TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#endif

Следующий код работает правильно для обоих, поскольку для iOS он соответствует первому случаю, а для Mac OS X он не соответствует первому, но соответствует второму.

#if TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#elif TARGET_OS_MAC
-(void)createColor:(NSColor*)color;

#endif

Ответ 2

Когда дело доходит до UIColor/NSColor, я обрабатываю его следующим образом:

#if TARGET_OS_IPHONE
#define ImageClassName UIImage
#else
#define ImageClassName NSImage
#endif

Затем в заголовочных файлах, и если вы просто передаете экземпляры вокруг, вы можете просто использовать, например. ImageClassName *.

Повторите блок #if в коде, когда вам нужно использовать API UIColor/NSColor.

Ответ 3

два определения, о которых вы говорите, установлены в 1 или 0 в зависимости от того, для чего вы компилируете! (во время компиляции)

так что вы на правильном пути здесь, я думаю,

например.

#if TARGET_OS_IPHONE
#import <CoreText/CoreText.h>
#elif TARGET_OS_MAC
#import <ApplicationServices/ApplicationServices.h>
#endif