【问题标题】:How to automatically choose between NSColor and UIColor for the correct build system? (Using a #define, or something)如何为正确的构建系统自动选择 NSColor 和 UIColor? (使用#define,或其他东西)
【发布时间】: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)?

【问题讨论】:

标签: objective-c cocoa c-preprocessor uicolor nscolor


【解决方案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

【讨论】:

【解决方案3】:

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

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

您的 API 将被声明:

+ (MONPlatformColor *)makeMeColorful;

【讨论】:

    猜你喜欢
    • 2012-11-29
    • 2023-02-26
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多