使用 Swift 将数据写入 OutputStream 5+
Writing Data to an OutputStream with Swift 5+
这段代码曾经很好(在编译器没有抱怨的意义上):
extension OutputStream {
func write(_ data: Data) -> Int {
return data.withUnsafeBytes { pointer in
return self.write(pointer, maxLength: data.count)
}
}
}
从 Swift 5.0 开始,这会产生警告:
Warning: 'withUnsafeBytes' is deprecated: use withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
instead
我尝试使用建议的方法,但我似乎无法将 UnsafeRawBufferPointer
转换为 OutputStream.write
最终需要的 UnsafePointer<UInt8>
。
如何以非弃用的方式编写此函数?
诀窍是使用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。
这段代码曾经很好(在编译器没有抱怨的意义上):
extension OutputStream {
func write(_ data: Data) -> Int {
return data.withUnsafeBytes { pointer in
return self.write(pointer, maxLength: data.count)
}
}
}
从 Swift 5.0 开始,这会产生警告:
Warning: 'withUnsafeBytes' is deprecated: use
withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
instead
我尝试使用建议的方法,但我似乎无法将 UnsafeRawBufferPointer
转换为 OutputStream.write
最终需要的 UnsafePointer<UInt8>
。
如何以非弃用的方式编写此函数?
诀窍是使用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。