【发布时间】:2017-09-05 19:10:17
【问题描述】:
我目前在调用我的 C++ 动态库中的一个函数时陷入僵局,该函数需要传递一个函数指针,其中该函数指针有一个指向字符串的指针的参数,来自我的 Swift 测试工具建成。我有一种感觉,要么我的测试工具中我的 Obj C++ 标头中的函数声明不正确,要么我在 Swift 中不正确地格式化调用。
我的 Obj C++ 库中的头文件(实现在我的 .mm 文件中):
@interface Objective_CPP : NSObject
- (void)InitCppDriver:(customCallbackType)readCompleteCallback;
@end
我的桥接头在我的测试工具中链接到的相应文件(不确定这是否等同于我的库项目中的声明):
@interface Objective_CPP : NSObject
- (void) InitCppDriver:(void (*)(const wchar_t* data))readCompleteCallback;
@end
在我的库项目(C++)中我的 customCallbackType 的声明:
typedef void(*customCallbackType)(const wchar_t* json);
extern customCallbackType frReadCompleteCallback;
我的 InitCppDriver 在我的库中的实现:
@implementation Objective_CPP
- (void)InitCppDriver:(customCallbackType)readMeterComplCallback
{
...
}
@end
当我在我的测试工具 (Swift) 中调用我的 InitCppDriver 函数时:
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 中工作,而且现在已经坚持了太久了。
如果有任何其他上下文我可以提供给这个问题,我很乐意发布更多代码。
谢谢!!
【问题讨论】:
-
Swift 函数不是 C 函数。
标签: c++ objective-c swift pointers objective-c++