首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试将某人用Swift 3编写的套接字编程代码更新为SWIFT5.2 (Inout表达式创建一个临时指针.)

尝试将某人用Swift 3编写的套接字编程代码更新为SWIFT5.2 (Inout表达式创建一个临时指针.)
EN

Stack Overflow用户
提问于 2020-11-15 08:07:38
回答 1查看 76关注 0票数 0

下面的代码最初是用Swift 3编写的,在Swift 4.2中没有警告,给出了警告"Inout表达式创建了一个临时指针,但是参数#1应该是一个指针,它比Swift 5中对‘+’的调用更有效,现在没有在Xcode 12中编译,错误地说“泛型参数‘元素’无法推断”。

代码语言:javascript
复制
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()函数之前附加到缓冲区来解决这个问题,但该应用程序在其他地方崩溃,可能是因为我错误地存储了这样的读取字节,从而破坏了套接字读取。

有任何建议如何纠正上述代码,以正确的方式读取和存储缓冲区?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-15 11:53:43

我通过显式使用.withUnsafeMutableBytes作为缓冲区解决了这个问题,因此将函数块更改为:

代码语言:javascript
复制
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
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64842337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档