下面的代码最初是用Swift 3编写的,在Swift 4.2中没有警告,给出了警告"Inout表达式创建了一个临时指针,但是参数#1应该是一个指针,它比Swift 5中对‘+’的调用更有效,现在没有在Xcode 12中编译,错误地说“泛型参数‘元素’无法推断”。
func readNUInt8(_ n:UInt32) throws -> [UInt8] {
var buffer = [UInt8](repeating: 0, count: Int(n))
var read = 0
while read < Int(n) {
read += recv(s, &buffer + read, Int(n) - read, 0)
if read <= 0 {
throw SocketError.recvFailed(Socket.descriptionOfLastError())
}
}
if bytesToRead >= UInt32(n) {
bytesToRead -= UInt32(n)
}
return buffer
}我试图通过将read转换为UInt8并在调用recv()函数之前附加到缓冲区来解决这个问题,但该应用程序在其他地方崩溃,可能是因为我错误地存储了这样的读取字节,从而破坏了套接字读取。
有任何建议如何纠正上述代码,以正确的方式读取和存储缓冲区?
发布于 2020-11-15 11:53:43
我通过显式使用.withUnsafeMutableBytes作为缓冲区解决了这个问题,因此将函数块更改为:
func readNUInt8(_ n:UInt32) throws -> [UInt8] {
var buffer = [UInt8](repeating: 0, count: Int(n))
var read = 0
while read < Int(n) {
var recvResult : ssize_t = 0
// let recvResult = recv(s, &buffer + read, Int(n) - read, 0)
buffer.withUnsafeMutableBytes { goPointer in recvResult = recv(s, goPointer.baseAddress! + read, Int(n) - read, 0) }
read += recvResult
if read <= 0 {
throw SocketError.recvFailed(Socket.descriptionOfLastError())
}
}
if bytesToRead >= UInt32(n) {
bytesToRead -= UInt32(n)
}
return buffer
}https://stackoverflow.com/questions/64842337
复制相似问题