【问题标题】:typedef struct from C to Swift从 C 到 Swift 的 typedef 结构
【发布时间】:2017-08-29 22:51:57
【问题描述】:

我正在开发一个访问 C 库的 Swift 应用程序。

.h 文件包含一个 typedef 结构:

typedef struct _DATA_KEY_ * CURRENT_DATA_KEY;

另外一个类中有一个方法:

 -(int) initWithKey(CURRENT_DATA_KEY * key);

我需要在我的代码中创建一个 CURRENT_DATA_KEY。不知道如何在 Swift 中实现这一点。

有一些旧的 Objective-C 代码使用:

CURRENT_DATA_KEY key = NULL;
initWithKey(key)

我试过了:

let myKey = UnsafeMutablePointer<CURRENT_DATA_KEY>.allocate(capacity: 1)

但是当我稍后尝试将它用作函数中的参数时,我得到了错误:

Cannot convert value of type 'UnsafeMutablePointer<_DATA_KEY_>' (aka 'UnsafeMutablePointer(<OpaquePointer>)') to expected argument type 'UnsafeMutablePointer(<_DATA_KEY_?>!)'

看起来该函数需要一个可选值?

我也试过了:

let myKey: CURRENT_DATA_KEY? = nil
let myKey: CURRENT_DATA_KEY = NSNull()

但那些会得到类似的类型错误。

如何创建:UnsafeMutablePointer(&lt;_DATA_KEY_?&gt;!)

【问题讨论】:

  • var myKey: CURRENT_DATA_KEY = nil 工作吗?
  • 不,它不起作用。

标签: ios c swift bridging-header


【解决方案1】:

自从我这样做以来已经有一段时间了,但是 IIRC 这个:

typedef struct _DATA_KEY_ * CURRENT_DATA_KEY;
-(int) initWithKey(CURRENT_DATA_KEY * key);

实际上相当于:

-(int) initWithKey(struct _DATA_KEY_ ** key);

因此,如果我们查找 Interacting with C APIs: Pointers 它属于:

Type **

变成:

AutoreleasingUnsafeMutablePointer&lt;Type&gt;

如果您知道 C struct 的成员,那么您可以将其视为 Swift struct 并使用合成的 init 方法。所以如果是这样定义的:

struct _DATA_KEY_ { 
  int foo
};

在 Swift 中变成这样:

public struct _DATA_KEY_ { 
  var foo: Int
  init()
  init(foo: Int)
}

你调用 init 方法如下:

// no parameter
let myKey = AutoreleasingUnsafeMutablePointer<_DATA_KEY_>(&_DATA_KEY_())

// parameter
let myKey = AutoreleasingUnsafeMutablePointer<_DATA_KEY_>(&_DATA_KEY_(foo: 12))

我没有尝试过这段代码,但我之前已经按照 Apple 文档中的建议进行了操作,并且效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2017-05-21
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多