Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 从NSInputStream读取IntegerType_Swift_Generics - Fatal编程技术网

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))
}