尝试将某人在 Swift 3 中编写的套接字编程代码更新为 Swift 5.2(Inout 表达式创建一个临时指针...)
Trying to update someone's socket programming code written in Swift 3 to Swift 5.2 (Inout expression creates a temporary pointer...)
以下代码最初写在 Swift 3 中,在 Swift 4.2 中没有警告地运行,给出了警告“Inout 表达式创建了一个临时指针,但参数 #1 应该是一个寿命更长的指针Swift 5 中对“+”的调用,现在根本无法在 Xcode 12 中编译,并出现错误提示“无法推断通用参数 'Element'”。
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 并附加到缓冲区来解决这个问题,但是应用程序在其他地方崩溃了可能是因为我通过不正确地存储读取字节来破坏套接字读取。
关于如何更正上述代码以正确读取和存储缓冲区的任何建议?
我通过显式使用 .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
}
以下代码最初写在 Swift 3 中,在 Swift 4.2 中没有警告地运行,给出了警告“Inout 表达式创建了一个临时指针,但参数 #1 应该是一个寿命更长的指针Swift 5 中对“+”的调用,现在根本无法在 Xcode 12 中编译,并出现错误提示“无法推断通用参数 'Element'”。
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 并附加到缓冲区来解决这个问题,但是应用程序在其他地方崩溃了可能是因为我通过不正确地存储读取字节来破坏套接字读取。
关于如何更正上述代码以正确读取和存储缓冲区的任何建议?
我通过显式使用 .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
}