【问题标题】:Swift cannot find private struct define in frameworkSwift 在框架中找不到私有结构定义
【发布时间】:2018-04-20 02:20:56
【问题描述】:

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

typedef struct _LinphoneCallParams LinphoneCallParams; 

当我尝试定义参数时

var callPara: LinphoneCallParams? 

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

LinphoneCallParams *callParams = xxxxxxx();

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

【问题讨论】:

    标签: swift objective-c-swift-bridge


    【解决方案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 对桥接系统不可见,或者它还不存在。

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 2015-05-19
      • 1970-01-01
      • 2019-12-31
      • 2012-12-06
      • 2015-04-29
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多