因为我需要继承一些在C ++中声明的处理程序作为超类,所以我必须将我的类声明为C++
类。但我也想使其成为两个Objective-C
类的委托。在我的C ++类中不可避免地要使用委托模式,但是我不知道如何使C ++类成为Objective-C类的委托。
有可能吗?还是有间接的方法可以做到这一点?
答案 0 :(得分:1)
您需要知道委托是在Objective-C中返回数据。因此,您使用C ++语言将类创建为超类,它将返回数据。所以我们开始吧。
首先,使用表示创建C ++类的C ++语言,然后添加Objective-C类。因此C ++类和objc类混合在一个xxx.h / xxx.mm中。
第二,您还需要委托,您只能在其他objc类中使用objc类工具。
查看测试代码。
TestViewController.h
#import <UIKit/UIKit.h>
class testC
{
public:
static int useCMethod();
};
@protocol helloCDelegate<NSObject>
@optional
- (void)testDelegateTransformDataInTest:(int)testNum;
@end
@interface TestViewController : UIViewController
@property (nonatomic,weak) id<helloCDelegate> delegate;
@end
TestViewController.mm -- section operate implement code
int testC::useCMethod(){
return 3;
}
// you can use C++ method and C++ object in sample method.
// also it use delegate in here,so you can implement in other view controller.
- (void)tapBackTranformReturnData
{
int num = testC::useCMethod();
[self.delegate testDelegateTransformDataInTest:num];
}
哦,最重要的事情之一就是必须将xxx.m
文件更改为xxx.mm
。这意味着可以使用C ++语言和Objective-C的Objective-C ++。
您需要此功能吗?希望对您有所帮助。
答案 1 :(得分:1)
这是一个快速而肮脏的例子。
需要委托给C ++的Objective-C类的接口和实现:
@interface MyClassOC : NSObject
@property id<MyDelegateProtocol> myDelegate;
-(void)doStuff;
@end
@implementation MyClassOC
-(void)doStuff {
if (self.myDelegate) {
[self.myDelegate performOperation];
}
}
@end
MyDelegateProtocol
是
@protocol MyDelegateProtocol
-(void)performOperation;
@end
用作委托的C ++类:
class MyDelegateCPP {
public:
void performOperation();
};
void MyDelegateCPP::performOperation() {
cout << "C++ delegate at work!\n";
}
MyClassOC
无法直接使用MyDelegateCPP
,因此我们需要将C ++类包装在可以使用C ++并且可以被Objective-C类使用的东西中。使用Objective-C ++进行救援!
包装器类:
@interface MyDelegateOCPP : NSObject <MyDelegateProtocol>
-(void)performOperation;
@end
// This needs to be in a .mm (Objective-C++) file; create a normal
// Objective-C file (.m) and change its extension to .mm, which will
// allow you to use C++ code in it.
@implementation MyDelegateOCPP {
MyDelegateCPP * delegateCPP;
}
-(id)init {
delegateCPP = new MyDelegateCPP();
return self;
}
-(void)performOperation {
delegateCPP->performOperation();
}
@end
这可以按如下方式使用:
MyDelegateOCPP * delegate = [[MyDelegateOCPP alloc] init];
MyClassOC * classOC = [[MyClassOC alloc] init];
classOC.myDelegate = delegate;
[classOC doStuff];
同样,这只是一个简化的草图,但希望它能给您一个想法。