2014-02-14 2 views
8

Я пытаюсь создать подкласс NSObject, который будет иметь множество методов, возвращающих цвета, поэтому я хочу вернуть UIColor, если я создаю для iOS или NSColor, если я создаю для OS X.
Это своего рода псевдо-код, что ожидаемое поведение должно быть:
Как автоматически выбрать NSColor и UIColor для правильной системы сборки? (Использование #define или что-то еще)

#define COLOR #if TARGET_OS_IPHONE UIColor #elif TARGET_OS_MAC NSColor #endif 

+ (COLOR *)makeMeColorful; 

можно ли сделать что-то вроде этого вместо того, чтобы делать 2 метода для каждого метода моего объекта (один для iOS и другой для OS X)?

+1

См. Http://stackoverflow.com/questions/15323109/creating-an-ios-os-x-cross-platform-class?rq=1 – rmaddy

ответ

13

Это абсолютно выполнимо. SKColor из SpriteKit, например, определяется как:

#if TARGET_OS_IPHONE 
#define SKColor UIColor 
#else 
#define SKColor NSColor 
#endif 

А затем используется так:

SKColor *color = [SKColor colorWithHue:0.5 saturation:1.0 brightness:1.0 alpha:1.0]; 

Это просто использует тот факт, что UIColor и NSColor доля некоторых из их методов класса.

+1

Очень умное яблоко. ;) – SevenBits

+2

Это было именно то, что я искал, спасибо вам, сэр! –

+1

Обратите внимание, что 'NSColor' и' UIColor' не разделяют * all * их API, поэтому вам нужно быть осторожными, чтобы не вызывать методы, которые существуют только на том или ином. – rickster

2

Вы можете использовать typedef в препроцессоре условного:

#if TARGET_OS_IPHONE 
typedef UIColor MONPlatformColor; 
#elif 
typedef NSColor MONPlatformColor; 
#endif 

И ваш API будет объявлен:

+ (MONPlatformColor *)makeMeColorful; 
5

Если вы используете Swift попробовать что-то в линиях

#if os(macOS) 
    typealias Color = NSColor 
#else 
    typealias Color = UIColor 
#endif 

Работы для macOS, iOS, tvOS и watchOS. Подробнее о Swift's preprocessor directives.

+0

Swift не использует такие флаги, как 'TARGET_OS_IPHONE'. Но у него есть [условия целевой платформы] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8 -ID31), как '#if os (iOS)'. – rickster

+0

Спасибо, что указали это! – fpg1503

 Смежные вопросы

  • Нет связанных вопросов^_^