如何使用Swift输出到STDERR?

 mobiledu2502887507 发布于 2023-01-11 17:06

我正在尝试使用Xcode 6和新的Swift语言为OS X创建命令行工具.如何将输出发送到stderr?这是用println完成的吗?

6 个回答
  • 可能是更好的方法,但您可以使用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))
    

    2023-01-11 17:08 回答
  • 对于Swift 4.x:

    import Darwin
    fputs("hello from libc\n", stderr)
    

    2023-01-11 17:08 回答
  • 这是一个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)
    

    2023-01-11 17:08 回答
  • 以下是三种增加复杂性的不同方法:

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

    2023-01-11 17:08 回答
  • 不是一个单独的答案,但建立在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)
    

    2023-01-11 17:08 回答
  • 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)
    }
    

    2023-01-11 17:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有