У меня был код, который выглядел почти точно, что вы делали, и получал то же предупреждение. Мой немного отличался таким образом, который имеет отношение к обсуждению
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
Это по-прежнему генерирует предупреждение о том, что UnsafeBufferPointer создает висячий указатель, но подсказки говорят: «создает указатель, действительный только на время вызова init (start: count :) '»
Но возврат из UnsafeBufferPointer ни к чему не привязан, поэтому я не смог использовать его вне области init, если попытался. Так что компилятор здесь предупреждает меня о том, чтобы я не делал то, что я не могу сделать.
Я думаю, Data.init (buffer:) может хранить ptr, но я предполагаю, что если он принимает UnsafeBufferPointer, он принимает на себя ответственность за его правильное использование
В любом случае, это все еще не решит твою проблему. Я обошел предупреждение с этим
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)
}
И это не генерирует предупреждение и, кажется, работает (в любом случае, в моем приложении). Вопрос о том, пройдет ли это экспертами, - это другой вопрос.
В некотором роде я испытываю ностальгию по временам HLock и HUnlock