gpt4 book ai didi

ios - 从 C 到 Swift 的 typedef 结构

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:59 26 4
gpt4 key购买 nike

我正在开发一个访问 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com