Comment puis-je sortir vers stderr avec Swift?

j'essaie de créer un outil en ligne de commande pour OS X avec Xcode 6 et le nouveau langage Swift. Comment envoyer la sortie à stderr? Est-ce fait avec println?

24
demandé sur JEscala 2014-06-04 19:27:45
la source

6 ответов

Pour Swift 4.x:

import Darwin
fputs("hello from libc\n", stderr)
16
répondu i40west 2018-08-22 00:26:14
la source

Peut-être une meilleure façon de le faire, mais vous pouvez utiliser 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))
17
répondu Rob Napier 2014-06-04 20:07:08
la source

Voici une Swift 3 extrait de

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)
14
répondu Ryan Heitner 2017-01-16 17:53:24
la source

pas vraiment une réponse séparée, mais en s'appuyant sur la réponse de Rob Napier, nous pouvons créer un objet comme stderr de sorte qu'il n'y a pas grand chose à changer quand Apple vient à fournir stderr comme un 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)

EDIT: Comme de 8/26/2015, Xcode 7 Beta 6, vous avez besoin de l' toStream: nom du paramètre, comme ceci:

println("on-stderr", toStream:&mx_stderr)
12
répondu Manav 2015-09-01 18:31:57
la source

Compliments de 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
http://crunchybagel.com/building-command-line-tools-with-swift/ dans la section intitulée:Écrit sur la sortie standard stdout / stderr, mais cette méthode n'utilise pas L'impression de Swift fonction de la bibliothèque.

et pour une balade vraiment folle, découvrez la méthode offerte par rosettacode.org utilisation de 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")
}
5
répondu Pinecone 2016-07-02 11:46:49
la source

Swift 4, similaire à la solution de Ryan mais au lieu d'étendre la manette de fichiers, a créé une nouvelle structure qui vous permet également de créer une classe spécifique StdErr et d'éviter le global.

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

exemple d'Utilisation:

do { 
    try somethingThatMightFail() 
} catch let error {
    var errStream = StandardErrorOutputStream()
    print("\(error)", to: &errStream)
    exit(EXIT_FAILURE)
}
5
répondu possen 2017-10-23 11:01:33
la source

Autres questions sur