2016-05-15 17 views
5

OS XのSwiftで外部Cライブラリを使用していますが、Cで定義されている値はdouble*ですそれは二重配列へのポインタです)。'UnsafePointer <Double>'の値を 'UnsafePointer <_>'に変換できません

Swiftにインポートするときに、そのタイプをUnsafeMutablePointerとして認識します。私はこのポインタとカウントをdouble配列に変換しようとしています。ここで私が使用しているコードは(arrlen配列の正しいカウントがあると仮定)です:

let doublearrptr = UnsafePointer<Double>(cda) 
let xptarr = UnsafeBufferPointer<Double>(start: doublearrptr, count:arrlen) 

このコードの断片をコンパイルするときしかし、私はエラーを取得:

Cannot convert value of type 'UnsafePointer<Double>' to expected argument type 'UnsafePointer<_>' 

私はSwiftに比較的新しいですが、私はUnsafePointer<_>に変換できないことはかなり確信しています。 UnsafePointer<Void>に変換しようとしましたが、同じエラーが発生しました。 SwiftはcdaUnsafeMutablePointer<Double>であることを認識します。

+0

"UnsafeMutablePointerとして型を認識している"と言うとき、それを 'UnsafeMutablePointer 'と認識しているのでしょうか? – paulvs

+0

はい、申し訳ありません。ダブルを認識します。 – Laxsnor

+0

ライブラリに依存しないコードを分離して掲載することはできますか? (例えば、Cのダブル配列を宣言し、それをSwiftの 'Array 'に変換しようとする)、エラーを生成している行を表示しますか?投稿したコードはOKと思われます。 – paulvs

答えて

3

だから、私はそれをラウンドアバウトで解決することができました。

私は新しい関数の変換を作成し、それを使用:

func convertArr<T>(count: Int, data: UnsafePointer<T>) -> [T] { 

    let buffer = UnsafeBufferPointer(start: data, count: count) 
    return Array(buffer) 
} 
... 
let doublearrptr = UnsafePointer<Double>(cda) 
let arr = convertArr(Int(shobjarrlen), data: doublearrptr) 

これは、元の構文は作品ではなく、いくつかの理由...

私はまだなぜから回答を得るために開いています私の元の構文は機能しませんでした。

+0

うわー、良い見つける。元のコードが正常だったはずであることに完全に同意します。私は同じ問題を抱えていました - これはSwiftのバグとよく似ています。 – HughHughTeotl

関連する問題