【问题标题】:Passing function pointer with string parameter from Swift to Obj C++将带有字符串参数的函数指针从 Swift 传递给 Obj C++
【发布时间】: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++


【解决方案1】:

您正在调用回调并尝试将返回值(())传递给 C++ 函数。你应该直接说Objective_CPP().InitCppDriver(callBack(outString:))

【讨论】:

  • 这是大部分问题。我最终意识到我必须在类之外声明 callBack (而不是作为方法函数),然后在没有参数的情况下传递该函数(因此它不会被调用)。这允许从 C++ 库调用回调。之后,我必须编辑我的函数以将 wchar_t 的长度发回,并将其转换为一个 swift Data 对象,这使我可以创建一个 NSString 并成功地将我的字符串放入我的 Swift 线束中。
猜你喜欢
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2021-02-19
  • 2019-09-28
  • 2015-06-03
  • 1970-01-01
相关资源
最近更新 更多