做者:Andyy Hope,原文连接,原文日期:2016-04-14
译者:SketchK;校对:Crystal Sun;定稿:CMBgit
时尚日志,由你作主程序员
在以前的文章中,咱们讨论了在输出日志中使用 emojis 的好处,它能够帮助咱们更好的去消化和吸取大量的信息,不过我提供的实现方式并不怎么样,没有足够多的例子供你将其应用在本身的代码中。github
我将遵照以前的约定继续讨论这个话题,向你展现如何使用 emojis 来实现输出日志的功能,只需在 print
函数上再多花费一点儿工夫。swift
在接下来的文章中,我会打破 Swift 的命名规范,这样作我可不缺理由。为了下降新方案的成本, 要在尽量减小键盘敲击次数的状况下达到一样的目标,好比字母大小写和标题大小写的问题。无论怎么样,若是看到文章的最后,你还在为一些细节而纠结的话, 你绝对应该把它们改为你想要的样子。xcode
enum log { }
这里使用枚举类型代替类或结构的缘由不少。缘由之一是,咱们永远不须要实例化一个日志。选择枚举而不是函数,是想确保实现一个安全的日志输出方案。不用着急,一会你就会明白我所说的“安全”的含义了.安全
enum log { case ln(_ line: String) case url(_ url: String) case obj(_ any: AnyObject) }
可能有些人还不知道 ln
(line) 曾经在 swift 语言中出现过。 print()
在 Swift 2.0 以后替代了 println()
, 且主要用于日志输出。我在这里举了一些例子来解释 log 枚举的可扩展性。app
要先为每个枚举值设置关联值,毕竟得现有东西才能输出日志吧?请注意,这里忽略了参数标签,由于已经使用参数名称来描述函数的参数了。框架
看一下目前的状况吧:函数
print(log.ln(“Hello World”)) // ln("Hello World") print("Hello World") // "Hello World"
嗯,看样子彷佛是完成了。但这看起来并非一个能够替代 print
的方案。主要缘由有这些:工具
仍是要敲击不少次键盘
除了原始信息外还有许多没必要要的内容
外表不怎么样
没有一个 emojis
千言万语,就一句:“这方案太糟糕了”
如今须要完善上面的五个问题, 以便实现以前定下的目标.
postfix operator / { }
先假定大家大多数人在这以前都没有遇到过自定义运算符的需求。不要紧,我也是最近才用上这个功能, 不过用的也不是太多.
要建立一个 postfix
后置运算符,展现的内容会出如今运算符的左侧,想让它出如今日志代码的后面, 只用敲击一次键盘就能实现。
选择 /
符号是由于它最接近注释符号但不会真正产生注释,另外它也是少数几个不用 shift 键来就能够直接打出来字符。
...感受本身就像是政客,在不停的想办法减小实现预算。
postfix func / (target: log) { switch target { case ln(let line): log("✏️", line) case url(let url): log("?", url) case obj(let object): log("?", object) }
这段代码看起来像声明,有代码主体(body), 增长了在约束,确保自定义操做符接收的参数是 log 枚举值,这在必定程度上符合我所说的的“安全代码”。“安全代码”这个概念还体如今使用枚举替代类或结构体,由于枚举中的 switch 必定会把全部状况都检查一遍。这样,每次想在输出日志中添加一个新的 emoji 时, 也必须将其添加到操做符中的 switch 语句里。
private func log<T>(emoji: String, _ object: T) { print(emoji + “ “ + String(object)) }
终于获得了这个看似很是简单 log
函数。它是一个私有函数,可不被 .swift
文件以外的任何东西访问到,另外它的第二个参数是一个泛型,这个参数可以接受任意类型的值。
正如你所看到的同样,这是一个至关简单的打印语句,把 emoji 表情和对象用空格连起来。
log.ln(“Pretty”)/ ✏️ Pretty log.url(url)/ ? http://www.andyyhope.com log.obj(date)/ ? 2016–04–02 23:23:05 +0000 Maybe i should use a screenshot here instead?
如今咱们有一个能够替代系统原有输出日志的方案了, 新方案只须要进行两次敲击,相比其余的日志输出工具,脱颖而出、畅快淋漓。不过这还没完呢...
大多数的程序员都会有这么一个共识,就是调用 print 方法会下降 app 的性能。若是含有 print 的代码散落在程序的不一样地方, 在 debug 的时候仍是能够接受, 但是要把 app 上传到 AppStore 时,最好仍是移除这些内容。
"你是在说,每一次我都必须在提交 App Store 前注释掉全部的 print 语句, 而后再在 debug 的时候把它们恢复回来么?" —— 你
能够用 Xcode 给工程建立配置文件, 在默认状况下 Xcode 会为每一个工程提供两个配置文件 : Debug 和 Release.
在使用模拟器或用 USB 链接真机时,默认模式是 debug,用手机打开从 AppStore 下载的 app 时,默认模式是 relsase。
把刚才写好的代码放入到用于标识 debug 状态的预编译标识符里, 这样就不用在每次打包的时候对这些代码进行注释/恢复/增长/删除等操做。至关于告诉编译器:“Hi,哥们,除了 release 模式下, 你都得运行这段代码!”
点击 Project Navigator 图标
点击 Project 名称
点击 Build Settings 按钮
搜索 “Compiler Flag”
展开 “Other C Flags”
点击 “+” 按钮
输入 “-D DEBUG”
最终把整个 print 函数放到预编译的标识符中。
private func log<T>(emoji: String, _ object: T) { #if DEBUG print(emoji + “ “ + String(object)) #endif }
哦了!如今只有在开发状态下 print 才会生效。把 build configuration scheme 设置改成Release,运行 app,这样就能够检测以前的操做是否成功,固然别忘了检测完把状态切回到 Debug 模式。
读到这, 也许会想:“这些个点子太好了, 若是 Andyy 将这些功能弄成一个...”,但事实是这样作并很差。
缘由就是, 假如我提供了上面三种方式中的任意一种, 那么每当你想利用它作日志输出的时候,你就必须在 Swift 文件里引入这个库, 这样作实在太傻了, 还须要作一些额外的操做来管理它们。这也是为何许多 NSLog 的替代品在 Objective-C 中表现很差的缘由。
import Log // 这看起来像坨 ?
我专门提供了一个 playground 文件,可以让你测试一下今天所读到的所有内容,若是想使用这个文件,只须要将 log.swift
文件拖入到工程中便可。另外在示例代码中会有一些额外的枚举值, 或许你会发现这些额外的例子对你的平常工做颇有用, 若是是这样的话,拿走不谢!
示例代码能够在 Github 上下载到.
就像以前同样, 若是你喜欢今天读到的内容或者亲手实现了它,请记得发我一个 tweet。很渴望听到大家的声音, 让我很受用.
本文由 SwiftGG 翻译组翻译,已经得到做者翻译受权,最新文章请访问 http://swift.gg。http://swift.gg。