2015-01-06 4 views
7

Ich schreibe ein Befehlszeilentool mit Swift und habe Probleme beim Anzeigen von Farben in meiner Shell. Ich verwende den folgenden Code:Farbausgabe mit dem Swift-Kommandozeilenwerkzeug

println("\033[31;32mhey\033[39;39m") 

oder sogar

NSFileHandle.fileHandleWithStandardOutput().writeData("\033[31;32mhey\033[39;39m".dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)!) 

Es funktioniert, wenn ich ein einfaches Echo in php (der Text in grün angezeigt wird), aber es gibt einen Grund, es doesn‘ t Arbeiten Sie in einem Swift-Befehlszeilentool?

Danke!

+0

Check hier, um diese erstaunliche Lösung aus: https://stackoverflow.com/questions/9005769/any-way-to-print-in-color-with-nslog – Martian2049

Antwort

19

Swift hat eine eingebaute Unicode-Unterstützung. Dies macht die Verwendung eines umgekehrten Schrägstrichs ungültig. Also verwende ich Farbcodes mit der Syntax "\ u {}". Hier ist ein Println-Code, der perfekt auf Terminal funktioniert.

// \u{001B}[\(attribute code like bold, dim, normal);\(color code)m 

// Color codes 
// black 30 
// red  31 
// green 32 
// yellow 33 
// blue 34 
// magenta 35 
// cyan 36 
// white 37 

println("\u{001B}[0;33myellow") 

Ich hoffe, es hilft.

+0

Es tatsächlich funktioniert, Vielen Dank! –

+1

Ich arbeite nicht für mich mit swift 1.2 Programmierung für iOS, ich sehe nicht die Farben in der Ausgabe – eliocs

+1

Die Xcode-Konsole druckt keine Farben in Sie installieren nicht das XcodeColors-Plugin -> https: // github .com/robbiehanson/XcodeColors – eliocs

17

Basierend auf @cy Antwort, habe ich eine einfache enum mit diesen Farben geschrieben und auch + Operator überladen, so dass Sie mit dieser Enum drucken können.

Es ist alles up on Github, aber es ist wirklich so einfach:

enum ANSIColors: String { 
    case black = "\u{001B}[0;30m" 
    case red = "\u{001B}[0;31m" 
    case green = "\u{001B}[0;32m" 
    case yellow = "\u{001B}[0;33m" 
    case blue = "\u{001B}[0;34m" 
    case magenta = "\u{001B}[0;35m" 
    case cyan = "\u{001B}[0;36m" 
    case white = "\u{001B}[0;37m" 

    func name() -> String { 
     switch self { 
     case black: return "Black" 
     case red: return "Red" 
     case green: return "Green" 
     case yellow: return "Yellow" 
     case blue: return "Blue" 
     case magenta: return "Magenta" 
     case cyan: return "Cyan" 
     case white: return "White" 
     } 
    } 

    static func all() -> [ANSIColors] { 
     return [.black, .red, .green, .yellow, .blue, .magenta, .cyan, .white] 
    } 
} 

func + (let left: ANSIColors, let right: String) -> String { 
    return left.rawValue + right 
} 

// END 


// Demo: 

for c in ANSIColors.all() { 
    println(c + "This is printed in " + c.name()) 
} 
+1

'" \ u {001B} [0; 0m "' auf die Standardfarbe zurücksetzen. – devios1

5

Sie können Regenbogen verwenden, wenn Sie nichts dagegen haben es als Rahmen verwendet wird.

import Rainbow 
print("Red text".red) 
print("Yellow background".onYellow) 
print("Light green text on white background".lightGreen.onWhite) 

https://github.com/onevcat/Rainbow