How to automatically choose between NSColor and UIColor for the correct build system? (Using a #define, or something)

StackOverflow https://stackoverflow.com/questions/21787498

Question

I'm trying to make a NSObject subclass that will have a lot of methods that return colors, so I wanna return UIColor if I'm building for iOS or NSColor if I'm building for OS X.
This is kind of a pseudo-code of what the expected behaviour should be:

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

+ (COLOR *)makeMeColorful;

Is it possible to do something like this instead of making 2 methods for each of my object's method (one for iOS and another for OS X)?

Was it helpful?

Solution

This is absolutely doable. SKColor from SpriteKit for example, is defined like:

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

And then utilized like this:

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

This simply takes advantage of the fact that UIColor and NSColor share some of their class methods.

OTHER TIPS

If you are using Swift try something in the lines of

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

Works for macOS, iOS, tvOS and watchOS. More on Swift's preprocessor directives.

You can use a typedef within the preprocessor conditional:

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

And your API would be declared:

+ (MONPlatformColor *)makeMeColorful;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top