【问题标题】:How to declare structure as return type of typealias in Swift如何在 Swift 中将结构声明为类型别名的返回类型
【发布时间】:2019-08-30 12:50:32
【问题描述】:

我正在使用 dlopen 函数从 swift 包中的 .dylib 导入 c 函数。 c 函数(即上行函数)将返回结构。为了从 swift 调用 c 函数,我需要创建 c 函数的类型别名。

C 结构

typedef struct Uplink  { long _handle; } UplinkRef;

C 函数声明

extern UplinkRef uplink(UplinkConfig p0, char** p1);

uplink 函数正在返回 UplinkRef 结构。

Swift 中的 UplinkRef 结构

struct UplinkRef{
 var _handle = -1
}

所以,我必须在 swift 中创建 typealias 以便我可以调用 c 函数

typealias uplink = @convention(c) ()->UplinkRef

1) 我如何将结构(即 UplinkRef)定义为 typealise 的返回类型?
2) 如何将结构(即 UplinkRef)定义为 typealias 的参数?

【问题讨论】:

    标签: swift struct type-alias


    【解决方案1】:

    如果struct UplinkRef 是,

    struct UplinkRef {
        var handle = -1
    }
    

    那么,

    1. UplinkRef 作为typealias 中的返回类型

    typealias Uplink1 = (()->(UplinkRef))
    

    2. UplinkRef 作为typealias 中的参数类型

    typealias Uplink2 = ((UplinkRef)->())
    

    【讨论】:

      【解决方案2】:

      这是您通常可以解决的方法:

      • 转到声明 C 函数的头文件。
      • 选择“生成的接口”助手视图。

      然后你会看到uplink()函数被导入到Swift中

      public func uplink(_ p0: UplinkConfig,
                         _ p1: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!) -> UplinkRef
      

      这样动态加载的 C 函数的正确类型别名是

      typealias UplinkFunc = @convention(c) (UplinkConfig,
          UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?) -> UplinkRef
      

      或者,添加

      typedef typeof(uplink) UplinkFunc;
      

      到桥接头文件,它作为函数类型的正确类型别名导入到 Swift。

      无论如何你应该在导入到 Swift 的 C 头文件中定义 C 结构,而不是在 Swift 中(重新)定义它们。这保证了正确保留相同的内存布局。

      【讨论】:

      • @ShivamKumar:你现在在 Swift 论坛上问了同样的问题:forums.swift.org/t/…。如果有任何不清楚的地方,请告诉我们,我们会尽力提供帮助。
      • 如何在swift中导入c结构并在swift中使用它们来调用c函数?
      • @ShivamKumar:您在 .h 文件中定义结构,并将该 .h 文件包含在桥接头文件中。
      • 无法在 SPM 包中使用桥接文件。还有其他建议吗?谢谢!用于回复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      相关资源
      最近更新 更多