如何为正确的构建系统自动选择 NSColor 和 UIColor? (使用#define,或其他东西)

Posted

技术标签:

【中文标题】如何为正确的构建系统自动选择 NSColor 和 UIColor? (使用#define,或其他东西)【英文标题】:How to automatically choose between NSColor and UIColor for the correct build system? (Using a #define, or something) 【发布时间】:2014-02-14 19:03:49 【问题描述】:

我正在尝试创建一个 NSObject 子类,它将有很多返回颜色的方法,所以如果我正在为 ios 构建,我想返回 UIColor,如果我正在为 OS 构建,我想返回 NSColor十. 这是预期行为的伪代码:

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

+ (COLOR *)makeMeColorful;

是否可以做这样的事情,而不是为我的每个对象的方法创建 2 个方法(一个用于 iOS,另一个用于 OS X)?

【问题讨论】:

见***.com/questions/15323109/… 【参考方案1】:

这是绝对可行的。例如,来自 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 共享它们的一些类方法这一事实。

【讨论】:

非常聪明的苹果。 ;) 请注意,NSColorUIColor 不会共享 所有 他们的 API,因此您必须注意不要调用仅存在于一个或另一个。【参考方案2】:

如果您使用的是 Swift,请尝试

行中的内容
#if os(macOS)
    typealias Color = NSColor
#else
    typealias Color = UIColor
#endif

适用于 macOS、iOS、tvOS 和 watchOS。更多关于Swift's preprocessor directives。

【讨论】:

Swift 不使用像 TARGET_OS_IPHONE 这样的标志。但它确实有target-platform conditionals 像#if os(iOS)【参考方案3】:

您可以在预处理器条件中使用typedef

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

您的 API 将被声明:

+ (MONPlatformColor *)makeMeColorful;

【讨论】:

以上是关于如何为正确的构建系统自动选择 NSColor 和 UIColor? (使用#define,或其他东西)的主要内容,如果未能解决你的问题,请参考以下文章

如何为 pybind11 正确构建活页夹

如何为我的触发器选择正确的行

如何为每次调用的 rpmbuild 设置构建区域

如何为团队或项目构建Confluence空间

如何为具有动态高度的表格单元格正确设置自动布局?

如何为Hadoop集群选择正确的硬件