2017-06-04 21 views
0

私はUINT8アレイにUInt16型に変換したいのですが、次のエラーメッセージ取得しています:使用できないSwift 3でUInt16をUInt8に変換するにはどうすればよいですか?

「初期化」をは:「withMemoryRebound(:容量:へ_)」を使用 に、一時的に別のレイアウトとしてメモリを表示互換型。

コード:

let statusByte: UInt8 = UInt8(status) 
    let lenghtByte: UInt16 = UInt16(passwordBytes.count) 

    var bigEndian = lenghtByte.bigEndian 

    let bytePtr = withUnsafePointer(to: &bigEndian) { 
     UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: MemoryLayout.size(ofValue: bigEndian)) 
    } 

答えて

3

エラーメッセージが示すように、あなたはUInt8へのポインタとしてUInt16へのポインタを再解釈するwithMemoryRebound() を使用する必要があります:閉鎖があるだけでポインタ($0)で呼び出され

let bytes = withUnsafePointer(to: &bigEndian) { 
    $0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout.size(ofValue: bigEndian)) { 
     Array(UnsafeBufferPointer(start: $0, count: MemoryLayout.size(ofValue: bigEndian))) 
    } 
} 

閉鎖の有効期間は であり、後で使用するためには外部に渡さないでください。 そのため、が作成され、戻り値として使用されます。

簡単な解決策は、しかし、があります。

let bytes = withUnsafeBytes(of: &bigEndian) { Array($0) } 

説明:withUnsafeBytesbigEndian変数のストレージへUnsafeRawBufferPointerと閉鎖を起動します。 UnsafeRawBufferPointerSequenceUInt8であるため、Array($0)で配列 を作成できます。

3

あなたは、整数のプロトコルを拡張し、次のようにデータプロパティを作成することができます。あなただけの配列を作成することができますので、スウィフト3データで

extension Integer { 
    var data: Data { 
     var source = self 
     return Data(bytes: &source, count: MemoryLayout<Self>.size) 
    } 
} 

はMutableCollectionに準拠のUInt16データからのバイト数:

extension Data { 
    var array: [UInt8] { return Array(self) } 
} 

let lenghtByte = UInt16(8) 
let bytePtr = lenghtByte.bigEndian.data.array // [0, 8] 
関連する問題