Swift如何带颜色打印

作者: 贺彦文 | 来源:发表于2016-03-24 17:38 被阅读1079次

    无颜色打印

    为了项目中的及时的调试,我们通常都会打印网络请求的URL信息,以及网络响应的字符串信息.而由于客户端和服务端信息交互无时不刻都在发生着,所以通常程序一启动,xcode控制台就抛出一大堆的打印信息.如果再点击跳转多几个页面,那Xcode控制台简直没法直视了,如下图.

    没有颜色打印各种信息难以区分

    带颜色打印

    因此我一直就想着能不能通过不同颜色来分门别类的打印.这样让我们开发者很直观就能在众多的信息中找到我们需要的调试信息,如下图.

    同样的打印信息加以颜色区别的效果

    安装步骤

    1,安装XcodeColors插件.

    下载XcodeColors插件,解压缩并运行.如果在github中搜索XcodeColors结果较多,我用的是robbiehanson的.如果安装了Alcatraz,通过插件安装更方便,直接搜索XcodeColors,搜索结果只有一个,安装即可.

    2,定义全局常量

    安装后重启Xcode,本质上带颜色打印,XcodeColors是通过识别打印信息中固定字符让Xcode输出对应的颜色.为了使用方便,我们就定义全局变量,跟在OC中定义宏是一个意思.具体代码如下,在swift中一下代码写在任意地方都可以,我是创建一个叫QGLog的文件专门来放各种颜色输出的函数.

    // 带颜色输出
    struct ColorLog {
        // 决定颜色输出的标识
        static let ESCAPE = "\u{001b}["
        // 决定前景色还是背景色
        static let RESET_FG = ESCAPE + "fg;" // Clear any foreground color
        static let RESET_BG = ESCAPE + "bg;" // Clear any background color
        static let RESET = ESCAPE + ";"   // Clear any foreground or background color
        
        // 红色输出
        static func red<T>(object: T) {
            print("\(ESCAPE)fg212,84,0;\(object)\(RESET)")
        }
        
        // 绿色输出
        static func green<T>(object: T) {
            #if DEBUG
                let scanner = NSScanner(string: "0x1f448")
                var result: UInt32 = 0
                scanner.scanHexInt(&result)
                let emoji = "\(Character(UnicodeScalar(result)))"
                print(emoji+"\(ESCAPE)fg38,173,97;\(object)\(RESET)")
            #endif
        }
        
        // 蓝色输出
        static func blue<T>(object: T) {
            #if DEBUG
                print("\(ESCAPE)fg0,0,255;\(object)\(RESET)")
            #endif
        }
        
        //黄色输出
        static func yellow<T>(object: T) {
            #if DEBUG
            print("\(ESCAPE)fg242,196,15;\(object)\(RESET)")
            #endif
        }
        
        //紫色输出
        static func purple<T>(object: T) {
            #if DEBUG
            print("\(ESCAPE)fg255,0,255;\(object)\(RESET)")
            #endif
        }
        
        //青色输出
        static func cyan<T>(object: T) {
            #if DEBUG
            print("\(ESCAPE)fg0,255,255;\(object)\(RESET)")
            #endif
        }
        
        // 打印两个对象分别蓝色和黄色输出
        static func blueAndYellow<T>(obj1:T,obj2:T) {
            #if DEBUG
                print("\(ESCAPE)fg0,0,255;\(obj1)\(RESET)" + "\(ESCAPE)fg255,255,0;\(obj2)\(RESET)")
            #endif
        }
        
        // 亮蓝色输出
        static func lightBlue<T>(obj1:T) {
            #if DEBUG
                let scanner = NSScanner(string: "0x1f449")
                var result: UInt32 = 0
                scanner.scanHexInt(&result)
                let emoji = "\(Character(UnicodeScalar(result)))"
                print(emoji+"\(ESCAPE)fg41,128,185;\(obj1)\(RESET)")
            #endif
        }
    }
    
    3,定义环境变量

    虽然本质上是可以让Xcode根据我们在打印信息中添加的额外字符来输出不同颜色的文字了.但是第一次集成的时候怎么都不能成功打印出漂亮的颜色来.github上的使用描述也没说为什么.原来是需要定义一个环境变量来链接Xcode工具和XcodeColors插件.

    • 在项目的target下点击Edit Scheme
    编辑Scheme
    • 选中Run 选中Arguments 在Environment Variables中添加XcodeColors 值为YES,添加的内容全部为手写,没有智能提示,要大胆自信的写.只要跟我写的一样,马上就打印出优雅美观的颜色输出来.
    添加环境变量的界面

    经过以上三步,接下来就Xcode控制台输出就任由你下令,发挥你的想象输出想要的任何颜色.它能让你临时添加的一个调试打印信息,在众多常规性的项目输出信息中脱颖而出.正如星爷电影里说的,没用的,你那样出色的打印无论在哪,都像黑夜里的萤火虫那样的鲜明.

    进阶使用

    1,快速查找特定打印信息

    例如上面的例子中点击了语音搜索界面这条打印信息,我是临时想看看按钮点击监听是否真的成功.
    如果没有颜色打印我需要在众多打印信息中,所有文字都一个颜色鱼龙混杂,拖动右侧的滚动条上下翻找点击了语音搜索界面这几个字.

    // 常规打印
    print("点击了语音搜索界面")
    

    而有了颜色之后,我可以对点击了语音搜索界面这个打印使用我自己订制的颜色.程序运行之后我只需要在控制台找红色即可,方便快捷.

    // 使用特定的红色打印
    ColorLog.red("点击了语音搜索界面")
    
    2,常规打印分类显示,不同颜色区分不同主体

    我们的项目中每次都要对请求的URl和响应的data打印.因此我封装网络请求工具类的时候统一对URL打印为蓝色,data打印为绿色.同时定义了一个输出两种颜色的打印函数,墨蓝色为控制器名称,蓝色为请求的URL.利用这样控制台显得更加干净利落

    发送请求打印两个对象,两种颜色输出 请求响应data使用绿色,层次分明
    ColorLog.darkBlueAndLightBlue("[\(self.classForCoder)]---------" , obj2: urlString.joinActionAndParams())
    

    相关文章

      网友评论

        本文标题:Swift如何带颜色打印

        本文链接:https://www.haomeiwen.com/subject/jhyrlttx.html