如何从.mm调用swift?

时间:2018-05-20 09:30:22

标签: swift opencv objective-c++

我使用objc ++和Swift创建了一个openCV camera stream,最后得到了一个有效的项目。

所以这些是我的文件:

1.openCVWrapper.h

#import "myProjectDelegate.h"
@interface OpenCVWrapper : NSObject
    - (void)setCameraDelegate: (id<OpenCVCamDelegate>) delegate;
@end

2.openCVWrapper.mm

@implementation OpenCVWrapper : NSObject
- (void) setCameraDelegate: (id<OpenCVCamDelegate>) delegate {
    myProject* camera = [myProject myProjectInstance];
    camera.delegate = delegate;
}
@end

3.myProject.h

@interface myProject : NSObject<CvVideoCameraDelegate> 
@property CvVideoCamera* cam;
@property id<OpenCVCamDelegate> delegate;

+ (id) myProjectInstance;
- (void) initializeCamera;

@end

4.myProject.mm

static void myStaticFunction() {
   // How to call "CALL_THIS_FUNCTION" from !right! here

}


- (void)processImage:(cv::Mat &)image {
    if (self.delegate != nil) {
        image = doSomething(image);
        [self.delegate callbackImage: MatToUIImage(image)];
    }
}

5.myProjectDelegate.h

@protocol OpenCVCamDelegate <NSObject>
- (void) callbackCameraFrame: (UIImage*) image;
@end

6.myProject.swift

class ViewController: UIViewController, OpenCVCamDelegate {
  var OpenCVWrapperInstance: OpenCVWrapper!

  override func viewDidLoad() {
     OpenCVWrapperInstance = OpenCVWrapper()
     OpenCVWrapperInstance.setCameraDelegate(self)     
  }

  func CALL_THIS_FUNCTION() {
     print("Yeah, success!");
  }

  func callbackCameraFrame(_ image: UIImage!) {
     // do some stuff with the image
  }
}

我的问题:

因此摄像机流和Swift的委托工作得很好但现在我想从CALL_THIS_FUNCTION中可以找到的静态方法调用Swift函数4.myProject.mm:。无论我已经尝试过什么似乎都不是正确的方法,因为到现在为止我还是无法正常工作。

我的第一个想法是在.myProject.mm中使用委托但是它是否发生了任何错误,也没有调用swift函数。看看我的代码:

id<OpenCVCamDelegate> myDelegate;
static void myStaticFunction() {
    // How to call "CALL_THIS_FUNCTION" from !right! here
    [globalDelegate CALL_THIS_FUNCTION];
}

注意:真的很感谢:)

1 个答案:

答案 0 :(得分:0)

我必须这样做一段时间,但这是工作流程:

  1. 使用@objc标记要展示的Swift类和相关函数。 (例如:@objc class ViewController: UIViewController, OpenCVCamDelegate {...}

  2. 在您的Obj-C .m文件中添加:#import <YourProductModuleName>-Swift.h

  3. 在.h中添加:@class ViewController(或其他Swift文件名)

  4. 您可以Command + Option点击@class ViewController查看Xcode为您生成的-Swift.h标头。

    您希望确保您使用Obj-C可以使用的对象类型。