我正在尝试编写一个通用函数,它将从 NSInputStream
中读取一个 int 类型的值:
func read<T : IntegerType>() -> T? {
var buffer : T = 0
let n = withUnsafePointer(&buffer) { (p) in
self.read(UnsafePointer<UInt8>(p), maxLength: sizeof(T))
}
if n > 0 {
assert(n == sizeof(T), "read length must be sizeof(T)")
return buffer
} else {
return nil
}
}
我基于我之前的 Google 搜索结果: https://gist.github.com/ishikawa/c3917ea4daa107f1ce68
一切似乎都很好,除了一件事:
withUnsafePointer(&buffer)
显示错误:
无法将“inout T”类型的值转换为预期的参数类型“inout _”
我不确定,如何解决这个问题 - 或者如果这个方法完全错误并且不起作用......
有人有什么想法吗?
编辑:
所需的功能:
let i: Int8 = stream.read()
let o: UInt32 = stream.read()
// etc.
最佳答案
read()
方法需要一个可变缓冲区指针:
let n = withUnsafeMutablePointer(&buffer) { (p) in
self.read(UnsafeMutablePointer(p), maxLength: sizeof(T))
}
占位符类型 <UInt8>
在 UnsafeMutablePointer(p)
可以从上下文自动推断。
请注意,您的方法存在一个普遍问题:如果输入
流未连接到真实文件,而是连接到某些通信 channel
(例如 TCP 套接字、管道等)那么唯一的保证就是 read()
等待直到至少一个字节被读取并且断言n == sizeof(T)
会失败。你必须在循环中再次阅读,直到所需的数量
已阅读。
关于swift - 从 NSInputStream 读取 IntegerType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33356178/