2017-08-29 86 views
1

我正在研究一个访问C库的Swift应用程序。typedef结构从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_?>!)

+0

'var myKey:CURRENT_DATA_KEY = nil'有效吗? –

+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成员,那么你或许可以把它像一个斯威夫特struct并使用合成init方法。所以如果是这样定义的:

struct _DATA_KEY_ { 
    int foo 
}; 

它变成这样斯威夫特:

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文档中的建议,并且运行良好。