swift - 从 NSInputStream 读取 IntegerType

标签 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 搜索结果: 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/

相关文章:

Swift:元组中的 `weak` 引用

c# - 具有接口(interface)和通用模​​型的 WCF

c++了解模板,类型名称的语法

c# - 接口(interface)扩展方法,具有匹配的通用参数

swift - Base64 字符串转 UIImage

ios - 我们应该如何快速在谷歌地图上放置标记?

ios - Swift 中 registerclass 的使用不明确

delphi - 为什么释放不为空的TList <Int64>不会导致内存泄漏?

c# - IQueryable<T> 相对于 IList<T> 的优势

ios - UITableView Cell 只需点击几下即可呈现 View Controller