这段代码曾经很好(就编译器而言,它并不抱怨):
extension OutputStream {
func write(_ data: Data) -> Int {
return data.withUnsafeBytes { pointer in
return self.write(pointer, maxLength: data.count)
}
}
}
从Swift 5.0开始,这会产生警告:
警告:不建议使用“ withUnsafeBytes”:改为使用
withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
我尝试使用建议的方法,但似乎无法将UnsafeRawBufferPointer
纠缠到UnsafePointer<UInt8>
最终需要的OutputStream.write
中。
如何以不推荐的方式编写此函数?
答案 0 :(得分:1)
技巧是使用bindMemory
函数:
func write(_ data: Data) -> Int {
return data.withUnsafeBytes({ (rawBufferPointer: UnsafeRawBufferPointer) -> Int in
let bufferPointer = rawBufferPointer.bindMemory(to: UInt8.self)
return self.write(bufferPointer.baseAddress!, maxLength: data.count)
})
}
虽然这可以在Swift 5.0上运行,但是显然存在一些问题。参见a related forum discussion。