2017-09-05 74 views
0

我目前在调用我的C++动态库中的函数的僵局,需要传递函数指针,其中函数指针具有指向一个字符串,来自我构建的Swift测试工具。我有一种感觉,我的测试工具中的Obj C++头部中的函数声明不正确,或者我在Swift中不正确地格式化调用。传递函数指针与字符串参数从Swift到Obj C++

在我的OBJ C++库头(实施是在我的.mm文件):

@interface Objective_CPP : NSObject 
- (void)InitCppDriver:(customCallbackType)readCompleteCallback; 
@end 

相应的文件我的桥接报头链接到我的测试工具(不能确定这是否是等效于声明中我的图书馆项目):

typedef void(*customCallbackType)(const wchar_t* json); 

extern customCallbackType frReadCompleteCallback; 

@interface Objective_CPP : NSObject 
- (void) InitCppDriver:(void (*)(const wchar_t* data))readCompleteCallback; 
@end 

我customCallbackType在我的库项目(C++)声明

我实现我的InitCppDriver的在我的图书馆:

@implementation Objective_CPP 
- (void)InitCppDriver:(customCallbackType)readMeterComplCallback 
    { 
    ... 
    } 
@end 

当我去打电话给我InitCppDriver功能在我的测试工具(SWIFT):

var ptrStr: UnsafePointer<wchar_t>?; 
Objective_CPP().InitCppDriver(callBack(outString: ptrStr)); 
... 
func callBack (outString:UnsafePointer<wchar_t>?){ 
    //code manipulating string here 
} 

我试图传递一个封闭和其他函数定义的数量,但最终得到的错误是我对此所尝试的一切的变体:

无法将类型'()'的值转换为预期的参数类型 '(@convention(c)(UnsafePointer?) - > Void)!'

我已经能够成功地打电话给我InitCppDriver功能,而无需传递给它一个函数指针的参数,但我似乎无法弄清楚如何调用相同的功能与函数的语法/设置指针参数。任何关于如何做到这一点的见解都会很棒 - 我不会经常在Obj-C或Swift工作,现在已经停留了很长时间。

如果有任何其他的情况下,我可以给这个问题,我会很乐意张贴更多的代码。

谢谢!

+0

一个Swift函数没有C函数。 –

回答

1

您正在调用回调函数,并试图将返回值(即())传递给C++函数。您应该改为Objective_CPP().InitCppDriver(callBack(outString:))

+0

这是问题的主要原因。我最终意识到我必须在类之外声明callBack(而不是作为方法函数),然后传递该函数而没有参数(所以它不会被调用)。这允许从C++库调用回调。之后,我不得不编辑我的函数来发送wchar_t的长度,并将其转换为一个swift数据对象,它允许我创建一个NSString,并成功将我的字符串放入我的Swift线束中。 –