【问题标题】:Does swift have a protocol for writing a stream of bytes?swift 是否有用于写入字节流的协议?
【发布时间】:2014-06-12 12:28:35
【问题描述】:

我在 Swift 书中找不到任何关于 io 的内容。是否有任何类似于 Java 的 OutputStream 或 Go 的 Writer 接口的通用协议来写入字节流?如果你正在编写一个返回流的类,你需要编写自己的协议还是使用Objective C协议?

需要明确的是,我为此要求一个 Swift 本机接口,不是因为我避免使用 Objective C 或 Cocoa,而是为了描述 Swift 到 Swift 代码未来的预期行为。

【问题讨论】:

  • 看起来很奇怪,标准库中没有这种基本的东西。如果你用 swift 编写,NSStream 真的不是你会怎么做的。
  • 我同意 Swift 目前在这方面还很欠缺,但它旨在与 Cocoa 框架一起工作。你有什么具体的尝试吗?
  • @tony 很好奇 - 你为什么不使用 NSStream?我不认为仅仅因为 Swift 的存在并不意味着 Cocoa 会消失。我想说这是在 Swift 中处理流的一种非常合法的方式。
  • @macandyp 不,我将使用 NSStream,当然这是合法的方式。这似乎不是很地道。我期待需要定期将可可用于特定用途,但实际上没有快速执行 io 的示例。你如何在没有 nserror 的情况下返回错误,何时使用选项等。即使几乎没有任何东西实现了 swift writer 协议,如果我写一些新的东西,我想使用它而不是 Obj C 方式。这真的是关于实现与协议。我可以同时写读者和作者,并且想知道这样做的本地方式。

标签: io swift outputstream


【解决方案1】:

这是 Swift 文档中很少提及的事情,我想了解更多信息,因此我进行了调查。

有一个协议,叫做Streamable

protocol Streamable {
    func writeTo<Target : OutputStream>(inout target: Target)
}

OutputStream:

protocol OutputStream {
    func write(string: String)
}

write 允许写入对象。

String 符合两者,使其易于写入和写入:

var target = String()
"this is a message".writeTo(&target)
println(target)
// this is a message

写入文件:

var msg = "this will be written to an output file"
msg.writeToFile("output.txt", atomically: false, encoding: NSUTF8StringEncoding, error: nil)
// creates 'output.txt' in the same folder as the executable

还有writeToUrl

我假设这些函数都建立在 Cocoa 流之上,它们具有相似的功能:

var os = NSOutputStream(toFileAtPath: "output.txt", append: true)
os.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

var msg = "a truly remarkable message"
var ptr:CConstPointer<UInt8> = msg.nulTerminatedUTF8

os.open()
os.write(ptr, maxLength: msg.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
os.close()

【讨论】:

  • 不错的发现。看起来他们仍在工作,这令人放心。
  • 请注意,Swift 5 中的协议已重命名为 TextOutputStreamableTextOutputStream(我认为也是 4)
猜你喜欢
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多