我正在开发一个访问 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);
所以如果我们查找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 文档中的建议并且运行良好。
关于ios - 从 C 到 Swift 的 typedef 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45949412/