2017-08-29 28 views
1

私はCライブラリにアクセスするSwiftアプリケーションに取り組んでいます。CからSwiftへのtypedef構造体

typedef struct _DATA_KEY_ * CURRENT_DATA_KEY; 

そして、そこ他のクラスのメソッド::

-(int) initWithKey(CURRENT_DATA_KEY * key); 

私は私のコードでCURRENT_DATA_KEYを作成する必要が

.hファイルには、typedefは構造体が含まれています。私がスイフトでそれをどのように達成できるかはわかりません。

使用していますいくつかの古いObjective-Cのコードがあります:

CURRENT_DATA_KEY key = NULL; 
initWithKey(key) 
私が試した

let myKey = UnsafeMutablePointer<CURRENT_DATA_KEY>.allocate(capacity: 1) 

をしかし、私は関数内の引数として後でそれを使用しようとすると、Iエラーが発生する:

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() 

しかし、これらは、同様のタイプのエラーが発生します。

はどのようにして作成するのです。だからもし

-(int) initWithKey(struct _DATA_KEY_ ** key); 

typedef struct _DATA_KEY_ * CURRENT_DATA_KEY; 
-(int) initWithKey(CURRENT_DATA_KEY * key); 

に実際に等価です。私はこれをやったが、IIRCが、これは以来UnsafeMutablePointer(<_DATA_KEY_?>!)

+0

'var myKey:CURRENT_DATA_KEY = nil'は機能しますか? –

+0

いいえ動作しません。 –

答えて

0

それは少しをされています見てくださいInteracting with C APIs: Pointersそれは下に落ちます:

Type **

なる:

AutoreleasingUnsafeMutablePointer<Type>

あなたがC structのメンバーを知っているなら、あなたはスウィフトstructのように扱うと合成さinit方法を使用することができます。それは次のように定義されているのであれば:私はこのコードを試していない

// no parameter 
let myKey = AutoreleasingUnsafeMutablePointer<_DATA_KEY_>(&_DATA_KEY_()) 

// parameter 
let myKey = AutoreleasingUnsafeMutablePointer<_DATA_KEY_>(&_DATA_KEY_(foo: 12)) 

struct _DATA_KEY_ { 
    int foo 
}; 

それはスウィフトでこのようになった:

public struct _DATA_KEY_ { 
    var foo: Int 
    init() 
    init(foo: Int) 
} 

そして、あなたは次のようにinitメソッドを呼び出します私は前にAppleの文書のアドバイスに従っており、うまくいきました。

関連する問題