2015-01-06 18 views
7

Sto scrivendo uno strumento da riga di comando con Swift e ho problemi a visualizzare i colori nella mia shell. Sto utilizzando il seguente codice:Uscita colore con lo strumento da riga di comando Swift

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

o anche

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

Funziona quando uso una semplice eco in php (il testo viene visualizzato in verde), ma c'è un motivo doesn' funziona con uno strumento da riga di comando rapido?

Grazie!

+0

di verificare questa soluzione incredibile qui: https://stackoverflow.com/questions/9005769/any-way-to-print-in-color-with-nslog – Martian2049

risposta

19

Swift ha integrato il supporto Unicode. Ciò invalida l'uso della barra posteriore. In modo che io usi i codici colore con la sintassi "\ u {}". Ecco un codice println che funziona perfettamente sul terminale.

// \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") 

Spero che sia d'aiuto.

+0

Funziona davvero, Grazie! –

+1

Non funziona per me con la programmazione swift 1.2 per iOS, non vedo i colori nell'output – eliocs

+1

La console Xcode non stampa i colori in te non installa il plugin XcodeColors -> https: // github .com/robbiehanson/XcodeColors – eliocs

17

In base alla risposta @cyt, ho scritto una semplice enumerazione con questi colori e ho anche sovraccaricato l'operatore + in modo da poter stampare utilizzando quell'enumerazione.

E 'tutto up on Github, ma è davvero così semplice:

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 "' per ripristinare il colore predefinito. – devios1

5

È possibile utilizzare Arcobaleno se non ti dispiace usandolo come un quadro.

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

https://github.com/onevcat/Rainbow

Problemi correlati