如何为正确的构建系统自动选择 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];
这只是利用了UIColor
和NSColor
共享它们的一些类方法这一事实。
【讨论】:
非常聪明的苹果。 ;) 请注意,NSColor
和 UIColor
不会共享 所有 他们的 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,或其他东西)的主要内容,如果未能解决你的问题,请参考以下文章