我正在尝试编写一个通用函数,它将从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 searcg: https://gist.github.com/ishikawa/c3917ea4daa107f1ce68
一切似乎都很好,除了一件事:
withUnsafePointer(&buffer)
显示错误:
Cannot convert value of type 'inout T' to expected argument type 'inout _'
我不确定,如何解决这个问题 - 或者这种做法是否完全错误并且无法工作......
任何想法?
编辑:
所需的功能:
let i: Int8 = stream.read()
let o: UInt32 = stream.read()
// etc.
答案 0 :(得分:2)
read()
方法需要可变缓冲区指针:
let n = withUnsafeMutablePointer(&buffer) { (p) in
self.read(UnsafeMutablePointer(p), maxLength: sizeof(T))
}
<UInt8>
中的占位符类型UnsafeMutablePointer(p)
可以从上下文中自动推断。
请注意,您的方法存在一般问题:如果输入
流未连接到真实文件,而是连接到某个通信通道
(例如TCP套接字,管道......)然后唯一的保证是read()
等待读取至少一个字节并断言n == sizeof(T)
可能会失败。您必须在循环中再次阅读,直到达到所需的金额
正在阅读。