如何从 .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_FUNCTION
在 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];
}
注意:任何帮助如何解决这个问题将不胜感激:)
我已经有一段时间没有这样做了,但这是工作流程:
用 @objc
标记您的 Swift class 和您想要公开的相关函数。 (例如:@objc class ViewController: UIViewController, OpenCVCamDelegate {...}
)
在您的 Obj-C.m 文件中添加:#import <YourProductModuleName>-Swift.h
在.h中添加:@class ViewController
(或其他Swift文件名)
您可以 Command
+Option
单击 @class ViewController
以查看 Xcode 为您生成的 -Swift.h header。
您需要确保您使用的 object 类型也可以与 Obj-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 的委托工作得很好,但现在我想从静态方法中调用 Swift 函数 CALL_THIS_FUNCTION
在 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];
}
注意:任何帮助如何解决这个问题将不胜感激:)
我已经有一段时间没有这样做了,但这是工作流程:
用
@objc
标记您的 Swift class 和您想要公开的相关函数。 (例如:@objc class ViewController: UIViewController, OpenCVCamDelegate {...}
)在您的 Obj-C.m 文件中添加:
#import <YourProductModuleName>-Swift.h
在.h中添加:
@class ViewController
(或其他Swift文件名)
您可以 Command
+Option
单击 @class ViewController
以查看 Xcode 为您生成的 -Swift.h header。
您需要确保您使用的 object 类型也可以与 Obj-C 一起使用。