2016-11-12 22 views
0

私はunsigned charの配列を.hファイルに持っています。また、私は入力としてunsigned char配列をとる関数を持っています。この関数をすばやく呼び出そうとすると、UnsafeMutablePointer<UInt8>が返されます。だから、自動目的-cは、unsigned charUnsafeMutablePointer<UInt8>に変換されるべきだと思う。しかし、私は変数をこの関数に直接渡すことはできません。私が得るので、unsinged char配列をobjective-cからUnsafeMutablePointerに変換する<UInt8> swift

Cannot convert value of type '(UInt8, UInt8, UInt8, UInt8, UInt8)' to expected argument type 'UnsafeMutablePointer<UInt8>!' 

この配列の長さは静的です。だから、私は私が必要とするすべてのKEYから値を読み込み、key

に割り当てforループを作成することです、だから、など

let key = UnsafeMutablePointer<UInt8>.allocate(capacity: 64); 

と、また、私はKEY.0して値を取得することができ、KEY.1を...作成することができます

for index in 1...64 { 
    key[index] = KEY[index]; 
} 

しかし、これは、コンパイルエラーを与える:、そう

Value of tuple type '(UInt8, UInt8, UInt8, UInt8, UInt8)' has no member 'index' 

私はから任意の値を取得することができますどのように最初の質問を、索引による。

public var ckey: (UInt8, ..., UInt8) 

と1つのタプル要素にアクセスすることはできません:秒で、ACアレイ

unsigned char ckey[64]; 

がスイフトにタプルとしてインポートさUnsafeMutablePointer<UInt8>

答えて

1

unsigned char配列に変換する任意の簡単な方法があります索引を添え字にすることによって。 (よく、あなたはMirrorを使用するとです)。しかしながら

:Cアレイの

  • アドレスは、第 配列要素のアドレスと同じであり、そしてCからインポート構造ため
  • は、スウィフトは、メモリレイアウトを保存します。

後者はconfirmed by Apple engineer Joe Groff:

だった...あなたはCで定義された構造体を残し、スウィフトにインポートすることができます。 SwiftはCのレイアウトを尊重します。

したがってあなたは 関数に最初のタプル要素のアドレスを渡すことができる。もちろん

f(key: &ckey.0) 

を - 配列のサイズに関する情報を が失われるので、 - Cのよう配列はNUL終端されるべきです、またはfが配列サイズについて約 を知るべきです。あるいは、関数に追加の引数としてサイズ を渡します。

foo(key: &ckey.0, length: MemoryLayout.size(ofValue: ckey)) 
関連する問題