从C到Swift的typedef结构

时间:2017-08-29 22:51:57

标签: ios c swift bridging-header

我正在开发一个访问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(<_DATA_KEY_?>!)

1 个答案:

答案 0 :(得分:0)

自从我做完这件事以来,我已经做了一点但是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<Type>

如果您了解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文档中的建议进行了操作,并且运行良好。