是否可以使C ++类成为Objc类的委托?

时间:2018-08-02 22:01:41

标签: c++ objective-c

因为我需要继承一些在C ++中声明的处理程序作为超类,所以我必须将我的类声明为C++类。但我也想使其成为两个Objective-C类的委托。在我的C ++类中不可避免地要使用委托模式,但是我不知道如何使C ++类成为Objective-C类的委托。

有可能吗?还是有间接的方法可以做到这一点?

2 个答案:

答案 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];

同样,这只是一个简化的草图,但希望它能给您一个想法。