Swift 从NSInputStream读取IntegerType
我正在尝试编写一个泛型函数,该函数将从Swift 从NSInputStream读取IntegerType,swift,generics,Swift,Generics,我正在尝试编写一个泛型函数,该函数将从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
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
}
}
read()
方法需要可变缓冲区指针:
let n = withUnsafeMutablePointer(&buffer) { (p) in
self.read(UnsafeMutablePointer(p), maxLength: sizeof(T))
}
可以从上下文自动推断UnsafeMutablePointer(p)
中的占位符类型
请注意,您的方法存在一个普遍问题:如果输入
流未连接到实际文件,而是连接到某个通信通道
(例如TCP套接字、管道等)那么唯一的保证就是read()
等待至少一个字节被读取,并且断言n==sizeof(T)
可能会失败。您必须在循环中再次读取,直到达到所需的数量
已阅读。谢谢,成功了!不确定我怎么会错过这个小问题-Xcode的错误消息也不会让它变得更容易。。。无论如何,我主要在
NSData
上使用它,它已经在内存中,所以这不是问题。我以前在ObjC中使用过这种方法,但由于我从未使用过它(因为我处理的是内存中的数据流),所以我决定不在ATM中实现它,因为在Swift中处理整数类型是地狱。(我需要能够改变结果
let n = withUnsafeMutablePointer(&buffer) { (p) in
self.read(UnsafeMutablePointer(p), maxLength: sizeof(T))
}