2016-11-30 7 views
1

はCで次のコードを考えてみましょう:Swift3:intに生のポインタを変換する(!int型の値であること自体をポインタ、どこにも指していない)

void someFunction (int type, void * someData) { 
    unsigned value = (int)someData; 
} 

私はこのコードは少し奇妙に見える知っているが、この機能コールバック関数であり、コールバック関数はvoid *引数をとる必要があります。実際には、someDataは実際にはいくつかのメモリ構造体へのポインタです(type)。その場合はそうではありません。その場合、それは実際には符号なしのint値です。そのような値へのポインタではなく、値そのものです。呼び出し側が本当にこのように、この関数を呼び出します。

unsigned value = ...; 
callbackFunction(type, (void *)value); 

ええ、それは愚かで醜いだが、私は、コードを書いていないと私はどちらかそれを変更することはできません。コールバックを実装するだけです。そして、私はSwift(Swift 3)でそうしたいと思っています。

func someFunction (_ type: Int, _ someData: UnsafeMutableRawPointer?) -> Void 

そして、私の関数がうまく呼ばれている...しかし、私は数字のポインタ値を得るのですかどのように私は、unsigned int型の値を必要とするそれを渡すよう:しかしスウィフトに、コールバックはこのように見えることがあります別の機能。

+0

可能な重複の:http://stackoverflow.com/questions/40569800/how-to-get-value-of- unsafemutablerawpointer – Fefux

+0

@Fefuxこれは実際には他の質問と重複している場合、その上の回答は、非常に貧しい、非常にエレガントなソリューションMartinRが提供していると考えて、;) – Mecki

+0

はい、私はこの可能な複製を投稿したが、本当に役に立ちました。 – Fefux

答えて

1

あなたは 整数としてポインタ値を取得するためにInt(bitPattern:)を使用することができます。

func someFunction (_ type: Int, _ someData: UnsafeMutableRawPointer?) -> Void { 
    let value = Int(bitPattern: someData) 
    print(value) 
} 
+0

恐ろしい!それは本当にうまくいく! :) BitPatternとして 'if let'は必要ありません:実際に' UnsafeMutableRawPointer? 'を取る – Mecki

+0

@Mecki:あなたは正しいです。 –

関連する問題