Swift-如何优化的使用Print

诉求

  • 美化控制台的内容输出,不要杂乱无章。

  • 对不同的输出内容,有不同的区分标志。

  • 执行打印的基础信息(文件名,行数,函数名)。

  • 针对字典和数组的输出像OC一样直观一些。

  • 针对网络请求(请求地址,参数,返回值)能一起打印。

这是我们最终输出的样式

? ======================= ? 
? ViewController.swift[28]: 各种数据类型()
1

? ViewController.swift[31]: 各种数据类型()
1.0

✏️ ViewController.swift[34]: 各种数据类型()
这个是一个字符串

? ViewController.swift[37]: 各种数据类型()
2021-07-13 03:44:31 +0000

☝️ ======================= ☝️ 


? ======================= ? 
? ViewController.swift[51]: 字典()
{
    A = alfa;
    B = bravo;
    C = charlie;
    D = delta;
    E = echo;
    F = foxtrot;
}

? ViewController.swift[59]: 字典()
{
    A = alfa;
    B = bravo;
    C = charlie;
    D = delta;
    E =     {
        A = alfa;
        B = bravo;
        C = charlie;
        D = delta;
        E = echo;
        F = foxtrot;
    };
    F =     {
        A = alfa;
        B = bravo;
        C = charlie;
        D = delta;
        E = echo;
        F = foxtrot;
    };
}

☝️ ======================= ☝️ 


? ======================= ? 
? ViewController.swift[69]: 数组()
(
    1,
    2,
    3,
    4,
    5,
    6
)

? ViewController.swift[78]: 数组()
(
    1,
        (
        1,
        2,
        3,
        4,
        5,
        6
    ),
        {
        A = alfa;
        B = bravo;
        C = charlie;
        D = delta;
        E = echo;
        F = foxtrot;
    }
)

☝️ ======================= ☝️ 


? ======================= ? 
? ViewController.swift[86]: 网络请求()
https//:www.baidu.com

? ViewController.swift[92]: 网络请求()
{
    key1 = value1;
    key2 = value2;
    key3 = value3;
}

? ViewController.swift[100]: 网络请求()
{
    A = alfa;
    B = bravo;
    C = charlie;
    D = delta;
    E = echo;
    F = foxtrot;
}

☝️ ======================= ☝️ 
复制代码

实现

github地址

import UIKit

public enum BTPrint {

    /// 字符串✏️
    case text(String)
    /// 字典?
    case dictionary([String: Any])
    /// 数组?
    case array([Any])
    /// 颜色 ?
    case color(UIColor)
    /// URL?
    case url(String)
    /// Error❌
    case error(NSError)
    /// Date?
    case date(Date)
    /// obj?‍❤️‍?‍?
    case obj(AnyObject)
    /// any ?
    case any(Any)
    /// 分割线?
    case beforeLine
    /// 分割线☝️
    case afterLine

    // 执行打印
    public func print(file: String = #file,
                   method: String = #function,
                   line: Int = #line) {
        let sign = "\((file as NSString).lastPathComponent)[\(line)]: \(method)"
        let emjio = getEmjio()
        let content = getContent()

        switch self {
        case .beforeLine:
            let allStr = "\n" + emjio + content + emjio
            Swift.print(allStr)
        case .afterLine:
            let allStr = emjio + content + emjio + "\n"
            Swift.print(allStr)
        default:
            let allStr = emjio + sign + "\n" + content + "\n"
            Swift.print(allStr)
        }
    }
}

extension BTPrint {
    private func getEmjio() -> String {
        switch self {
        case .text(_):
            return "✏️ "
        case .dictionary(_):
            return "? "
        case .array(_):
            return "? "
        case .color(_):
            return "? "
        case .url(_):
            return "? "
        case .error(_):
            return "❌ "
        case .date(_):
            return "? "
        case .obj(_):
            return "?‍❤️‍?‍? "
        case .any(_):
            return "? "
        case .beforeLine:
            return "? "
        case .afterLine:
            return "☝️ "

        }
    }

    private func getContent() -> String {

        func content<T>(_ object: T) -> String {
            let temp = "\(object)"
            return temp
        }
        switch self {
        case .color(let color):
            return content(color)
        case .text(let line):
            return content(line)
        case .url(let url):
            return content(url)
        case .error(let error):
            return content(error)
        case .any(let any):
            return content(any)
        case .obj(let obj):
            return content(obj)
        case .date(let date):
            return content(date)
        case .dictionary(let dict):
            return content("\(String(describing: dict as AnyObject))")
        case .array(let arr):
            return content("\(String(describing: arr as AnyObject))")
        case .beforeLine, .afterLine:
            return content("======================= ")
        }
    }
}

复制代码

其他

在 macOS上快速打开表情包 Ctrl + Command + Space官方介绍

企业微信截图_f26fc101-da7c-4fdb-8bea-8096cea501ff.png

设置debug下才print

image.png

  • 选中Target
  • 选择你的项目名称
  • 选择 build Settings
  • 搜索 Compiler Flag
  • 展开 Other C Flags
  • 双击Debug, 点击 +
  • 输入 -D DEBUG
#if DEBUG
   Swift.print(allStr)
#endif
复制代码

参考

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享