Tenía un código que parecía casi exactamente lo que estabas haciendo y recibía la misma advertencia. La mía difería ligeramente de una manera que es relevante para la discusión
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
Esto todavía genera la advertencia de que UnsafeBufferPointer está produciendo un puntero colgante, pero las sugerencias dicen "produce un puntero válido solo durante la duración de la llamada a 'init (start: count :)'"
Pero el retorno de UnsafeBufferPointer no está asignado a nada, por lo que no podría usarlo fuera del alcance del init si lo intentara. Entonces el compilador aquí me advierte que no haga algo que no puedo hacer de todos modos.
Supongo que Data.init (buffer:) podría estar almacenando el ptr, pero supongo que si acepta un UnsafeBufferPointer, está aceptando la responsabilidad de usarlo correctamente
De todos modos, eso todavía no soluciona tu problema. Eludí la advertencia con esto
init<T>(from value: T) {
var value = value
var myData = Data()
withUnsafePointer(to:&value, { (ptr: UnsafePointer<T>) -> Void in
myData = Data( buffer: UnsafeBufferPointer(start: ptr, count: 1))
})
self.init(myData)
}
Y esto no genera la advertencia y parece funcionar (en mi aplicación de todos modos). Si pasa reunión con los expertos aquí es otra cuestión.
Algo así me pone nostálgico por los días de HLock y HUnlock