创build一个iOS / OS X跨平台类

我读了很多有关为这两个系统创build一个跨平台库的问题。 每个答案都指向静态库作为解决scheme。

我不想结束一个静态库,我想创build一个iOS的方法和他们的对应的OS X的类。

-(void)createColor:(NSColor*); -(void)createColor:(UIColor*); 

我遇到的第一个问题是,我无法find一种方法来使用仅在特定系统中可用的类。 所以,例如,我怎么能pipe理一个在iOS中与UIColor和OS X中的NSColor一起使用的NSColor

如果我为iOS创build项目,当我查看Foundation.h我无法在标题列表中findNSColor.h

我想用TARGET_OS_MACTARGET_OS_IPHONE定义来区分这两个系统…我走对了吗?

编辑添加更多信息:

目前我有两个目标:iOSTestApp和OSxTestApp。 对于这些目标,我已经根据系统包含了所需的框架。

使用TARGET_OS_MACTARGET_OS_IPHONE仅在selectOSXTestApp作为活动目标时才起作用。 当我selectiOSAppTest时,Xcode返回OS X数据types的错误(即NSColor

这里是产生这些错误的代码的一个例子:

 #if TARGET_OS_MAC -(void)createColor:(NSColor*)color; #elif TARGET_OS_IPHONE -(void)createColor:(UIColor*)color; #endif 

而如果我反转它的工作定义…这里产生这些错误的代码的一个例子:

 #if TARGET_OS_IPHONE -(void)createColor:(UIColor*)color; #elif TARGET_OS_MAC -(void)createColor:(NSColor*)color; #endif 

你看到的问题是由于TARGET_OS_IPHONE被定义为TARGET_OS_MAC一个变种而TARGET_OS_MAC 。 (换句话说, TARGET_OS_IPHONETARGET_OS_IPHONE的一个更具体的例子,或者TARGET_OS_MAC是一个矩形,因为TARGET_OS_IPHONE是一个正方形)。

所以下面的代码在编译iOS时会出错,因为iOS会匹配这两个条件,但是NSColor没有为iOS定义。

 #if TARGET_OS_MAC -(void)createColor:(NSColor*)color; #elif TARGET_OS_IPHONE -(void)createColor:(UIColor*)color; #endif 

以下代码适用于两者,因为对于iOS,它与第一种情况相匹配,而对于Mac OS X,它与第一种不匹配,但与第二种匹配。

 #if TARGET_OS_IPHONE -(void)createColor:(UIColor*)color; #elif TARGET_OS_MAC -(void)createColor:(NSColor*)color; #endif 

说到UIColor / NSColor,我是这样处理的:

 #if TARGET_OS_IPHONE #define ImageClassName UIImage #else #define ImageClassName NSImage #endif 

然后,在头文件中,如果你只是传递实例,你可以使用例如ImageClassName *

在需要使用UIColor / NSColor API时,重复代码中的#if块。

你所说的两个定义被设置为1或0取决于你编译的东西! (编译时)

所以我想你在这里是正确的

例如

 #if TARGET_OS_IPHONE #import <CoreText/CoreText.h> #elif TARGET_OS_MAC #import <ApplicationServices/ApplicationServices.h> #endif