从NSInputStream中读取IntegerType

时间:2015-10-26 21:43:29

标签: 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 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.

1 个答案:

答案 0 :(得分:2)

read()方法需要可变缓冲区指针:

let n = withUnsafeMutablePointer(&buffer) { (p) in
    self.read(UnsafeMutablePointer(p), maxLength: sizeof(T))
}

<UInt8>中的占位符类型UnsafeMutablePointer(p)可以从上下文中自动推断。

请注意,您的方法存在一般问题:如果输入 流未连接到真实文件,而是连接到某个通信通道 (例如TCP套接字,管道......)然后唯一的保证是read() 等待读取至少一个字节并断言n == sizeof(T) 可能会失败。您必须在循环中再次阅读,直到达到所需的金额 正在阅读。