0

以下代码最初用 Swift 3 编写,在 Swift 4.2 中运行时没有警告,在 Swift 5 中给出警告“Inout 表达式创建一个临时指针,但参数 #1 应该是一个比对 '+' 的调用更长的指针”,现在不是完全在 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
    }

我试图通过在调用 recv() 函数之前将读取转换为 UInt8 并附加到缓冲区来解决这个问题,但应用程序在其他地方崩溃可能是因为我通过错误地存储读取的字节来破坏套接字读取。

任何建议如何更正上述代码以正确读取和存储缓冲区?

4

1 回答 1

0

我通过显式使用 .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
    }
于 2020-11-15T11:53:43.127 回答