2016-08-17 35 views
8

Mam następujący problem. Chcę przekonwertować moją starą funkcję (działa do Swift 3 beta 5):Użycie withMemoryRebound z jabłkami Swift 3 beta 6

func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T 
{ 
    return value.withUnsafeBufferPointer 
    { 
     return UnsafePointer<T>($0.baseAddress!).pointee 
    } 
} 

Do składni Swift 3 beta 6. Funkcja ta przekształca tablicę Uint8 do innego typu, na przykład:

let b: [UInt8] = [1,2,3,4,5,6,7,8] 
var number: Double = binarytotype(b, Double.self) 

Ale teraz to nie działa dłużej w beta 6 i muszę używać withMemoryRebound ale ja naprawdę nie wiem, jak to zrobić biegać. Czy ktoś może mi pomóc?

Odwrotna funkcja ta była:

func typetobinary <T> (_ value: T) -> [UInt8] 
{ 
    var v: T = value 
    return withUnsafePointer(to: &v) 
    { 
     Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>($0), count: MemoryLayout<T>.size)) 
    } 
} 

To nie działa dłużej, zbyt. Taki sam problem. Oba są potrzebne w przypadku niektórych moich projektów. Ta funkcja Reverse nazwano jako:

var binary: [UInt8] = typetobinary(number) 

Odpowiedz

9

wskaźnika konwersji są bardziej "pełny", odkąd Xcode 8 beta 6. tutaj jest możliwe rozwiązania

func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T { 
    return value.withUnsafeBufferPointer { 
     UnsafeRawPointer($0.baseAddress!).load(as: T.self) 
    } 
} 

func typetobinary<T>(_ value: T) -> [UInt8] { 
    var data = [UInt8](repeating: 0, count: MemoryLayout<T>.size) 
    data.withUnsafeMutableBufferPointer { 
     UnsafeMutableRawPointer($0.baseAddress!).storeBytes(of: value, as: T.self) 
    } 
    return data 
} 

przykład:

let d = typetobinary(UInt16(1000)) 
print(d) // [232, 3] 
let i = binarytotype(d, UInt16.self) 
print(i) // 1000 

Zobacz SE-0107 UnsafeRawPointer API dla szczegółowe informacje o nowym interfejsie API surowego wskaźnika.

+0

Działa doskonale, dziękuję bardzo !!! –