2016-11-02 19 views
5

Mam mały problem z mojego kodu po aktualizacji do Swift 3. Miałem ten kod przed przebudową:Swift: Nie można przekonwertować wartości typu „UnsafeMutablePointer” do oczekiwanego typu argumentu „UnsafeMutablePointer”

extension NSData { 
    func castToCPointer<T>() -> T { 
    let mem = UnsafeMutablePointer<T>.alloc(sizeof(T.Type)) 
    self.getBytes(mem, length: sizeof(T.Type)) 
    return mem.move() 
    } 
} 

I i konwertowane go do niniejszego Kodeksu oraz w 3. wierszu pojawia się błąd

... nie można przekonwertować wartości typu „” do oczekiwanego UnsafeMutablePointer typu argumentu „UnsafeMutablePointer”

extension Data { 
    func castToCPointer<T>() -> T{ 
    let mem = UnsafeMutablePointer<T>.allocate(capacity: MemoryLayout<T.Type>.size) 
    self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size) 
    //self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size) 
    return mem.move() 
    } 
} 

Czy ktoś wie, jak się tego pozbyć?

Odpowiedz

4

copyBytes oczekuje UnsafeMutableBufferPointer jako argument: (. allocate() bierze liczbę "pozycji" jako argumentu, a nie liczba bajtów)

extension Data { 
    func castToCPointer<T>() -> T { 
     let mem = UnsafeMutablePointer<T>.allocate(capacity: 1) 
     _ = self.copyBytes(to: UnsafeMutableBufferPointer(start: mem, count: 1)) 
     return mem.move() 
    } 
} 

jednak pamiętać, że metoda przecieki pamięci, przydzielona pamięć jest deinicjowana (z move()), ale musi również być zdezalokowana:

extension Data { 
    func castToCPointer<T>() -> T { 
     let mem = UnsafeMutablePointer<T>.allocate(capacity: 1) 
     _ = self.copyBytes(to: UnsafeMutableBufferPointer(start: mem, count: 1)) 
     let val = mem.move() 
     mem.deallocate(capacity: 1) 
     return val 
    } 
} 

Prostszym rozwiązaniem byłoby (od round trip Swift number types to/from Data):

extension Data { 
    func castToCPointer<T>() -> T { 
     return self.withUnsafeBytes { $0.pointee } 
    } 
} 
+0

Dziękuję :) ostatni pracował doskonale!! –

0

Można również skorzystać z poniższego składni w rozszerzeniu

extension Data { 
    func castToCPointer<T>() -> T { 
     var bytes = self.bytes 
     var val = withUnsafePointer(to: &bytes) { (temp) in 
      return unsafeBitCast(temp, to: T.self) 
     } 
     return val 
    } 
} 

var data:NSData/NSMutableData 
var bytes = data.bytes 
var val = withUnsafePointer(to: &bytes) { (temp) in 
    return unsafeBitCast(temp, to: T.self) 
} 
Powiązane problemy