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)
发生这种情况是因为两个包含都发生在同一个编译单元中。您可以通过将其中一个枚举移动到单独的编译单元中来解决此问题,代价是使该枚举器的值成为非编译时常量(实际上,它们成为全局变量)。
在 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)
| 归档时间: |
|
| 查看次数: |
16402 次 |
| 最近记录: |