如何自动选择适用于正确构建系统的NSColor和UIColor?(使用#define或其他方法)

11

我想创建一个NSObject子类,其中包含许多返回颜色的方法,所以如果我在iOS上构建,我希望返回UIColor,如果在OS X上构建,则返回NSColor
以下是预期行为的伪代码:

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

+ (COLOR *)makeMeColorful;

我可以这样做吗,而不是为我的每个对象的方法制作两种方法(一种用于iOS,另一种用于OS X)?


1
请查看https://dev59.com/f2Up5IYBdhLWcg3wXGu8?rq=1,该问题与iOS和OS X跨平台类的创建有关。 - rmaddy
3个回答

15

这是完全可行的。例如,SpriteKit中的SKColor可以这样定义:

#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];

这只是利用了 UIColorNSColor 共享一些类方法的事实。


1
非常聪明的苹果。 ;) - SevenBits
1
请注意,NSColorUIColor并不共享所有API,因此您必须小心,不要调用仅存在于其中一个的方法。 - rickster

8
如果你正在使用Swift,可以尝试类似以下的代码:
#if os(macOS)
    typealias Color = NSColor
#else
    typealias Color = UIColor
#endif

适用于macOS、iOS、tvOS和watchOS。更多信息请参见Swift的预处理指令


Swift 不使用像 TARGET_OS_IPHONE 这样的标志。但它确实有 目标平台条件,比如 #if os(iOS) - rickster

3
您可以在预处理条件中使用 typedef
#if TARGET_OS_IPHONE
typedef UIColor MONPlatformColor;
#elif
typedef NSColor MONPlatformColor;
#endif

你的API将被声明为:

+ (MONPlatformColor *)makeMeColorful;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接