2016-09-19 6 views
8

Xcode 8をインストールしてプロジェクトをSwift 3に変換する前に、次の行が問題ありませんでした。今変換後、それは次のようになります。Swift 3とXcode8 - 曖昧なinitの使用

let valueData:Data = Data(bytes: UnsafePointer<UInt8>(&intVal), count: sizeof(NSInteger)) 

それは誤り

「INIT」のあいまいな使用

はスウィフト3で、それの何が問題であることを示していますか?それを修正するには?

答えて

6

、あなたドン明示的なポインタ変換またはサイズ計算が必要ない:

var intVal = 1000 
let data = Data(buffer: UnsafeBufferPointer(start: &intVal, count: 1)) 
print(data as NSData) // <e8030000 00000000> 

より一般的な変換方法値はData に戻って戻ります(例:round trip Swift number types to/from Dataを参照)。

+0

配列&バッファ[offset]の要素へのポインタを取得しようとすると問題が発生します。この答えは、 "inout [UInt8]の値を添字できません"と失敗します。 withUnsafePointerを使用した別の回答が正常に機能する – Dale

7

UnsafePointerUnsafePointerUnsafeMutablePointer両方の初期化子を持っている、とのsizeofは、次のようにそれを明確にMemoryLayoutに移動されました:単純な値からDataを作成する最も簡単な方法は、 UnsafeBufferPointerを経由して行くことです

let valueData = withUnsafePointer(to: &intVal){ 
    return Data(bytes: $0, count: MemoryLayout<NSInteger>.size) 
} 
+0

この回答は私のために働いた(受け入れられた回答ではない)。 – i4niac

+0

@ i4niac:両方の答えが現在のXcode 8.2.1で動作し、同じ結果が得られることを再確認しました。私の答えに問題がある場合は教えてください。どのように動作しませんか?あなたは間違いや間違った結果を得ますか? –

+0

私の場合、私はUInt8の配列を持ち、&buffer [offset]へのポインタが必要です。この回答はうまくいきますが、UnsafeBufferPointerを受け入れられた答えに従って使用すると、 – Dale