我正在尝试使用Xcode 6和新的Swift语言为OS X创建命令行工具.如何将输出发送到stderr?这是用println完成的吗?
可能是更好的方法,但您可以使用NSFileHandle
:
import Foundation // Create a file handle to work with let stderr = NSFileHandle.fileHandleWithStandardError() // Build up a string; whatever you want let stuff = "something" let something = "I'm a string with \(stuff) in it\n" // Write it stderr.writeData(something.dataUsingEncoding(NSUTF8StringEncoding))
对于Swift 4.x:
import Darwin fputs("hello from libc\n", stderr)
这是一个Swift 3片段
来自https://gist.github.com/algal/0a9aa5a4115d86d5cc1de7ea6d06bd91
import Foundation var standardError = FileHandle.standardError extension FileHandle : TextOutputStream { public func write(_ string: String) { guard let data = string.data(using: .utf8) else { return } self.write(data) } } print("I am printed to stderr",to:&standardError)
以下是三种增加复杂性的不同方法:
Erica Sadun在http://ericasadun.com/2015/06/09/swift-2-0-how-to-print/的致意:
public struct StderrOutputStream: OutputStreamType { public mutating func write(string: String) { fputs(string, stderr) } } public var errStream = StderrOutputStream() debugPrint("Hello", toStream: &errStream) // prints with new line
对于使用NSFileHandle.fileHandleWithStandardError的略有不同的方法,请参阅:http://crunchybagel.com/building-command-line-tools-with-swift/ 标题为:写入stdout/stderr,但此方法不使用Swift的打印库功能.
对于一个非常疯狂的旅程,请查看rosettacode.org提供的方法,使用NSOutputStream,网址为https://www.rosettacode.org/wiki/Hello_world/Standard_error#Swift:
let out = NSOutputStream(toFileAtPath: "/dev/stderr", append: true) let err = "Goodbye, World!".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) out?.open() let success = out?.write(UnsafePointer<UInt8>(err!.bytes), maxLength: err!.length) out?.close() if let bytes = success { print("\nWrote \(bytes) bytes") }
不是一个单独的答案,但建立在Rob Napier的答案之上,我们可以创建一个类似stderr的对象,这样当Apple提供stderr时,没有太大的改变OutputStreamType
:
import Foundation class StandardErrorOutputStream: OutputStreamType { func write(string: String) { let stderr = NSFileHandle.fileHandleWithStandardError() stderr.writeData(string.dataUsingEncoding(NSUTF8StringEncoding)) } } var mx_stderr = StandardErrorOutputStream() println("on-stdout") println("on-stderr", &mx_stderr)
编辑:截至2015年8月26日,Xcode 7 Beta 6,您需要toStream:
参数名称,如下所示:
println("on-stderr", toStream:&mx_stderr)
Swift 4,类似于Ryan的解决方案,但不是扩展FileHandle,而是创建了一个新结构,它还允许您创建一个StdErr特定类并避免全局.
struct StandardErrorOutputStream: TextOutputStream { let stderr = FileHandle.standardError func write(_ string: String) { guard let data = string.data(using: .utf8) else { return // encoding failure } stderr.write(data) } }
用法示例:
do { try somethingThatMightFail() } catch let error { var errStream = StandardErrorOutputStream() print("\(error)", to: &errStream) exit(EXIT_FAILURE) }