I also met these annoying warnings.
var str = "aaaaabbbbbccccc"
var num1 = 1
var num2 = 22
var data = Data()
// Initialization of 'UnsafeBufferPointer<String>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &str, count: 1))
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &num1, count: 1))
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &num2, count: 1))
Considering @greg’s answer, I put the Data.append
into withUnsafePointer
‘s closure, and it does not show warnings anymore.
withUnsafePointer(to: &str) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num1) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num2) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
Here is the extension
extension Data {
init<T>(value: T) {
self = withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) -> Data in
return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
}
}
mutating func append<T>(value: T) {
withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) in
append(UnsafeBufferPointer(start: ptr, count: 1))
}
}
}