1

我在使用 swift-bridge-header 功能访问 c 代码框架(liblinphone)时遇到问题。在 types.h 中定义的结构 LinphoneCallParams 可以在框架头文件中找到。结构定义如下

typedef struct _LinphoneCallParams LinphoneCallParams; 

当我尝试定义参数时

var callPara: LinphoneCallParams? 

在 swift 文件中,Xcode 将显示此错误通知“使用未声明的类型'LinphoneCallParams'”。(访问该文件中的其他定义没有问题,所以swift-briging-header文件没有问题) 搜索_LinphoneCallParams的定义,该定义位于未包含在SDK中的private.h中。但有趣的是,如果我使用 Object-C 代码来定义这个参数

LinphoneCallParams *callParams = xxxxxxx();

一切正常。我不想使用 Object-C 代码来实现这个项目。知道为什么会这样吗?

4

1 回答 1

1

桥接编译器非常积极地丢弃它认为不需要的东西。

如果struct _LinphoneCallParams实际上不存在,则相关的typedef/typealias不会进入生成的标题。

比较这两个例子。

struct _BoodleParams存在:

在此处输入图像描述

并做到这一点:

class Thing {
    var boodle = _BoodleParams(foo: 3, bar: 4)
    var doodle = _BoodleParams(foo: 2, bar: 1)
}

或这个:

class Thing {
    var boodle = BoodleParams(foo: 3, bar: 4)
    var doodle = BoodleParams(foo: 2, bar: 1)
}

同样有效的代码。

但是,当您不再需要typedef存在于对应部分时,它会在桥接过程中被剥离。

在此处输入图像描述

请注意,只要符号_BoodleParams存在于已编译的 Objective-C 中的某个位置,typedef 就会在对应的部分中进行。

在此处输入图像描述

总之,LinphoneCallParams不能在您的 Swift 代码中实例化的原因是该符号struct _LinphoneCallParams对桥接系统不可见或尚不存在。

于 2018-04-20T04:53:18.623 回答