2017-03-16 26 views
1

初始化一個結構變種與數據我有這樣如何swift3

struct Str{ 

let item1: UINT16 
let item2: UINT16 
let item3: UINT32 

} 

我有一個結構變種myStr的

var mystr = Str(item1: 0x0101, item2: 0xffff, item3: 4) 

一個結構,我已經存儲結構VAR成數據var

var myData = Data(bytes: &mystr, count:MemoryLayout<Str>.size) 

我的問題是如何使用Dat一個變種初始化新海峽VAR(數據的值存儲到結構)

感謝

回答

1

我沒有足夠的專家來告訴多麼危險只是傾銷一些內存爲Data對象,然後使用內存來初始化一個結構的,但這裏是你可以做什麼:

let strFromData = myData.withUnsafeBytes { (p: UnsafePointer<Str>) -> Str in 
    return p.pointee 
} 

或者更短:

let strFromData2 = myData.withUnsafeBytes { $0.pointee as Str } 

我在以前的工程中的已經做了TS是處理一個結構的成員一個接一個:

let strFromData3 = myData.withUnsafeBytes { (p: UnsafePointer<UInt16>) -> Str in 
    let item1 = p[0] 
    let item2 = p[1] 
    let p2 = UnsafeRawPointer(p).bindMemory(to: UInt32.self, capacity: 2) 
    let item3 = p2[1] 
    return Str(item1: item1, item2: item2, item3: item3) 
} 

extension Data 
{ 
    mutating func append<T>(value: T) 
    { 
     var v = value 
     self.append(UnsafeBufferPointer(start: &v, count: 1)) 
    } 
} 

var data = Data() 
data.append(value: mystr.item1) 
data.append(value: mystr.item2) 
data.append(value: mystr.item3) 

使用Str的初始化建立從myData一個Str