J'avais un code qui ressemblait presque exactement à ce que vous faisiez et recevait le même avertissement. Le mien différait légèrement d'une manière pertinente pour la discussion
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
Cela génère toujours l'avertissement que UnsafeBufferPointer produit un pointeur suspendu, mais les conseils indiquent "produit un pointeur valide uniquement pour la durée de l'appel à" init (start: count :) ""
Mais le retour de UnsafeBufferPointer n'est affecté à rien, donc je ne pourrais pas l'utiliser en dehors de la portée de l'initialisation si j'essayais. Donc, le compilateur ici m'avertit de ne pas faire quelque chose que je ne peux pas faire de toute façon.
Je suppose que Data.init (buffer:) pourrait stocker le ptr, mais je suppose que s'il accepte un UnsafeBufferPointer, il accepte la responsabilité de l'utiliser correctement
Quoi qu'il en soit, cela ne résout toujours pas vraiment votre problème. J'ai contourné l'avertissement avec ça
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)
}
Et cela ne génère pas l'avertissement et semble fonctionner (dans mon application de toute façon). Que cela passe avec les experts ici est une autre question.
Cela me rend nostalgique des jours de HLock et HUnlock