Bytes inseguros en Swift 3

Estoy escribiendo un file en el disco y estoy en el process de convertir mi código a Swift 3, y me quedé atrapado en algo. Quería ver si alguien podía darme un empujón en la dirección correcta.

Mi bloque de código actual es:

open let text: NSString data = possibleData ?? Data() open let fileURL: URL? open let fileEncoding: String.Encoding? fileprivate let data: Data! text = NSString(bytesNoCopy: UnsafeMutableRawPointer(mutating: data.bytes.bindMemory(to: Void.self, capacity: data.count)), length: data.count, encoding: encoding.rawValue, freeWhenDone: false)! 

Swift está diciendo que llamar a data.bytes no está disponible y que necesito usar .unsafebytes en su lugar. No entiendo cómo invoca bytes no seguros (no es tan simple como cambiar bytes a bytes no seguros)

Entonces investigué un poco y algunas personas dijeron que usar un bloque de cierre como este:

 data.withUnsafeMutableBytes {(bytes: UnsafeMutablePointer<UInt8>)->Void in //work with bytes in here } 

Mi problema es, ¿qué pongo dentro del bloque de cierre para que funcione mi código anterior? Creo que me estoy perdiendo algo fundamentalmente. No puedo usar bytes porque vuelve a generar el mismo error.

¿Alguien tiene alguna idea? ¡Gracias!

Si realmente necesita usar este patrón, suponiendo que los data eran var y no let , podría hacer algo como:

 let text = data.withUnsafeMutableBytes { bytes in return NSString(bytesNoCopy: bytes, length: data.count, encoding: encoding.rawValue, freeWhenDone: false)! } 

O bien, no sé por qué usaría NSString , por lo que podría hacer lo siguiente:

 let text = data.withUnsafeMutableBytes { bytes in return String(bytesNoCopy: bytes, length: data.count, encoding: encoding, freeWhenDone: false)! } 

Francamente, todo este patrón parece frágil (¿por qué forzar el molde? ¿Por qué usar pointers peligrosos en lugar de varios patrones seguros? Etc.). Si está escribiendo esto en un file, ¿por qué no acaba de escribir los Data directamente?

 do { try data.write(to: fileURL) } catch { print("Error: \(error.localizedDescription)") }