2017-08-29 115 views
1

我正在研究一個訪問C庫的Swift應用程序。typedef結構從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_?>!)

+0

'var myKey:CURRENT_DATA_KEY = nil'有效嗎? –

+0

不,它不起作用。 –

回答

0

這是一個有點,因爲我已經做到了這一點,但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成員,那麼你或許可以把它像一個斯威夫特struct並使用合成init方法。所以如果是這樣定義的:

struct _DATA_KEY_ { 
    int foo 
}; 

它變成這樣斯威夫特:

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文檔中的建議,並且運行良好。