繁体   English   中英

从C到Swift的typedef结构

[英]typedef struct from C to Swift

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

自完成此操作以来已有一段时间,但IIRC却这样:

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

实际上等于:

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

因此,如果我们查找与C API交互:指针,则它属于:

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文档中的建议,并且效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM