C言語だとESC(27 = \x1b = \033)を使って"\x1b[31mあああ"
としてやれば、コマンドライン出力に色をつけたりできるけど、swiftでは違うみたいなので調べた。
swiftだと"\u{nn}"
で1バイトのユニコードスカラ値を表現するので、"\u{1b}[31mあああ"
となる.
ちなみに他の言語だと"\e"
がESCとして使えるのが結構ある
➜ ~ swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Target: x86_64-apple-macosx10.9
colorTest.swift
#!/usr/bin/swift
import Foundation
public enum ESCCode : UInt {
case Reset = 0, Bold = 1, Faint, UnderLine = 4, BlinkSlow, Negative = 7
case Black = 30, Red, Green, Yellow, Blue, Magenda, Cyan, White
case BackgroundBlack = 40, BackgroundRed, BackgroundGreen, BackgroundYellow, BackgroundBlue, BackgroundMagenda, BackgroundCyan, BackgroundWhite
static let backGroundColorOffset: UInt = 10
static func escapeCode(value: UInt) -> String { return "\u{1b}[\(value)m" }
var escString: String { return self.dynamicType.escapeCode(self.rawValue) }
}
extension String {
func escape(esc: ESCCode, reset: Bool = true) -> String {
return "\(esc.escString)\(self)\(reset ? ESCCode.Reset.escString : "")"
}
}
public func printError(message: String, exit shouldTerminate: Bool = false, terminator: String = "\n") {
if let data = "\(message.escape(.Red))\(terminator)".dataUsingEncoding(NSUTF8StringEncoding) {
NSFileHandle.fileHandleWithStandardError().writeData(data)
}
if shouldTerminate { exit(1) }
}
let str: String = "abcABC"
for i: UInt in ESCCode.Bold.rawValue..<ESCCode.Negative.rawValue+1 {
if let esc = ESCCode(rawValue: i) {
print("\\x1b[\(esc.rawValue)m \(str.escape(esc))")
}
}
print("")
print(" | \\x1b[3*m | \\x1b[4*m |")
print("___ | ________ | ________ |")
for i: UInt in ESCCode.Black.rawValue ..< ESCCode.White.rawValue+1 {
if let color = ESCCode(rawValue: i), bcolor = ESCCode(rawValue: i+ESCCode.backGroundColorOffset) {
print("*=\(i-ESCCode.Black.rawValue) | \(str.escape(color)) | \(str.escape(bcolor)) | ");
}
}
print("")
printError("警告")
printError("warning", exit: true)
print("unreachable")