Как позвонить в swift из .mm? - PullRequest
0 голосов
/ 20 мая 2018

Я создал openCV camera stream, используя objc ++ и Swift, и у меня получился рабочий проект.

Итак, это мои файлы:

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_FUNCTION из статического метода, который вы можете найти в 4.myProject.mm:.То, что я уже пробовал, кажется неправильным, потому что до сих пор я не мог заставить его работать.

Моей первой идеей было использование делегата в .myProject.mm, но не возникло ли ошибок или ошибок.это называется быстрой функцией.Посмотрите на мой код:

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

Примечание : Любая помощь в решении этой проблемы будет очень признательна :)

1 Ответ

0 голосов
/ 20 мая 2018

Прошло много времени с тех пор, как я должен был это сделать, но это был рабочий процесс:

  1. Отметьте свой класс Swift и связанные функции, которые вы хотите предоставить, с помощью @objc.(например: @objc class ViewController: UIViewController, OpenCVCamDelegate {...})

  2. В вашем файле Obj-C .m добавьте: #import <YourProductModuleName>-Swift.h

  3. В .h добавьте:@class ViewController (или другое имя файла Swift)

Вы можете Command + Option щелкнуть по @class ViewController, чтобы увидеть заголовок -Swift.h, который Xcode генерирует для вас.

Вы должны быть уверены, что используете типы объектов, с которыми может работать и Obj-C.

...