如何从 .mm 调用 swift?

How to call swift from .mm?

我使用 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 的委托工作得很好,但现在我想从静态方法中调用 Swift 函数 CALL_THIS_FUNCTION4.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. @objc 标记您的 Swift class 和您想要公开的相关函数。 (例如:@objc class ViewController: UIViewController, OpenCVCamDelegate {...}

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

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

您可以 Command+Option 单击 @class ViewController 以查看 Xcode 为您生成的 -Swift.h header。

您需要确保您使用的 object 类型也可以与 Obj-C 一起使用。