簡體   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