如何解决来自单独的objc框架的“枚举器重新定义”错误

pul*_*hal 5 paypal objective-c xcode4.2

AuthNet和PayPal移动支付库都定义了ENV_LIVE枚举器。这导致了Xcode错误,例如:

Redefinition of enumerator 'ENV_LIVE' ...
Run Code Online (Sandbox Code Playgroud)

在像这样的情况下,人们不能简单地更改依赖框架的源代码,在Objective-C语法或xcode配置中可以使用哪些变通办法?

原来:

#import "PayPal.h"
#import "AuthNet.h"
...
// AuthNet
[AuthNet authNetWithEnvironment:ENV_TEST];

// PayPal
if (STATUS_COMPLETED_SUCCESS == [PayPal initializationStatus]) {
    [PayPal initializeWithAppID:@"APP-XXX" forEnvironment:ENV_SANDBOX];
}
Run Code Online (Sandbox Code Playgroud)

UPDATE(这是我根据正确答案最终用作解决方法的结果):

#import "PayPal.h"
@class AuthNet;
#import "AuthNetWorkaround.h"
...
[AuthNet authNetWithEnvironment:AUTHNET_ENV_TEST];
Run Code Online (Sandbox Code Playgroud)
extern const int AUTHNET_ENV_LIVE;
extern const int AUTHNET_ENV_TEST;

@interface AuthNetWorkaround : NSObject

@end
Run Code Online (Sandbox Code Playgroud)
#import "AuthNetWorkaround.h"
#import "AuthNet.h"

@implementation AuthNetWorkaround

const int AUTHNET_ENV_LIVE = ENV_LIVE;
const int AUTHNET_ENV_TEST = ENV_TEST;

@end
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

发生这种情况是因为两个包含都发生在同一个编译单元中。您可以通过将其中一个枚举移动到单独的编译单元中来解决此问题,代价是使该枚举器的值成为非编译时常量(实际上,它们成为全局变量)。

在 pp_workaround.h 中:

extern const int PAYPAL_ENV_LIVE;
Run Code Online (Sandbox Code Playgroud)

在 pp_workaround.m 中:

#import "PayPal.h" // I'm completely making up the name of PayPal's header
// The import of "AuthNet.h" is missing

const int PAYPAL_ENV_LIVE = ENV_LIVE;
Run Code Online (Sandbox Code Playgroud)

现在,您可以包含"pp_workaround.h"代替"PayPal.h",并使用PAYPAL_ENV_LIVE代替ENV_LIVE。并非一切都一样,但编译时错误应该消失了。

编辑如果您的代码允许您仅在 .m 文件中导入冲突的标头,您可以通过将连接代码包装在您自己的附加抽象层中来解决问题(而不是解决它),如下所示:

在 paypal_init.h 中:

extern void connect_paypal();
Run Code Online (Sandbox Code Playgroud)

在 paypal_init.m 中:

#import "PayPal.h"
#import "paypal_init.h"

void connect_paypal() {
    // Use ENV_LIVE from PayPal.h here
}
Run Code Online (Sandbox Code Playgroud)

在 authnet_init.h 中:

extern void connect_authnet();
Run Code Online (Sandbox Code Playgroud)

在 authnet_init.m 中:

#import "AuthNet.h"
#import "authnet_init.h"

void connect_authnet() {
    // Use ENV_LIVE from AuthNet.h here
}
Run Code Online (Sandbox Code Playgroud)

在您的主文件中:

#import "authnet_init.h"
#import "paypal_init.h"

void init() {
    connect_paypal();
    connect_authnet();
}
Run Code Online (Sandbox Code Playgroud)