ios - 从 C 到 Swift 的 typedef 结构

标签 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_?>!)

最佳答案

自从我完成此操作以来已经有一段时间了,但 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/

相关文章:

c - 系统调用 fork() 和 execv 函数

swift - 展开 node.name.last() 时发现 nil

ios - ALAssetsLibrary assetForURL : always returning nil for photos in "My Photo Stream" in iOS 8. 1

ios - 我如何检测第 3 次应用程序启动

android - 移动应用中的 CSRF

ios - 在 iOS 上通过 BLE 发送数据时的最大数据大小

c - 使用 stat() 函数测试 DIRENT 是目录还是文件的正确方法是什么?

c - 为什么当我对文件执行 fwrite() 时没有写入文件?

swift - 如何在 SwiftUI 中使 popover 的大小适合其内容

ios - 根据字符串名称数组过滤 Person 对象数组的有效方法